本章开始介绍Python的面向对象编程,Python这种动态语言的面向对象和很多强类型语言如JAVA,C#,C++等语法上区别还是比较大的,但总体思路基本还是相通的。面向对象编程是一种编程范式,它使用对象来表示现实世界中的实体,并通过这些对象的交互来实现程序的功能。
面向对象编程的核心概念
-
类(Class):类是对象的蓝图,定义了对象的属性(变量)和行为(方法)。在Python中,你使用
class
关键字来定义类。 -
对象(Object):对象是类的实例。每个对象都拥有类定义的属性和方法。对象的创建通常通过调用类的构造方法(
__init__
)来完成。 -
继承(Inheritance):继承是一种机制,子类(派生类)可以继承父类(基类)的属性和方法。这允许代码重用和扩展现有类的功能。
-
封装(Encapsulation):封装是将对象的内部状态(属性)和行为(方法)捆绑在一起,并对外隐藏其内部实现细节的过程。这有助于保护对象的完整性和简化编程。
-
多态(Polymorphism):多态允许不同的对象对同一消息做出响应,即使这些对象可能是不同类的实例。这意味着同一个接口可以用于不同的数据类型。
类和对象
在Python中,定义一个类并创建对象的基本语法如下:
class MyClass: def __init__(self, attribute): self.attribute = attribute def my_method(self): # 做一些操作 pass
# 创建对象
my_object = MyClass("some value")
在这个例子中,MyClass
是一个类,它有一个构造方法__init__
和一个普通方法my_method
。self
是对象的引用,用于访问对象的属性和方法。
方法
类的方法是定义在类内部的函数,它们用于执行类实例(对象)的操作。在面向对象编程中,方法是类的重要组成部分,因为它们定义了对象的行为。以下是类方法的详细介绍:
-
实例方法
实例方法是类中最常用的方法类型,它们作用于类的单个实例。实例方法的第一个参数总是self
,它是对当前对象实例的引用。通过self
,方法可以访问和修改对象的属性。
class Person: def __init__(self, name): self.name = name # 实例变量 def say_hello(self): # 实例方法 print(f"Hello, my name is {self.name}.")
在这个例子中,say_hello
是一个实例方法,它使用self
来访问name
属性。
-
类方法和静态方法
除了实例方法外,Python还支持类方法(Class Methods)和静态方法(Static Methods)。
类方法:使用@classmethod
装饰器定义,它们的第一个参数是cls
,表示类本身。类方法可以访问类属性和其他类方法,但不能直接访问实例属性。
- 当你需要定义一个方法,它需要访问类的属性或其他类方法时。
- 当方法需要修改类级别的属性或状态时。
- 用于实现类的行为,而不是特定实例的行为。
class MyClass:counter = 0 # 类变量@classmethoddef get_counter(cls):return cls.counterdef __init__(self):MyClass.counter += 1# 通过类名调用
print(MyClass.get_counter()) # 输出类变量的值# 通过实例调用
instance = MyClass()
print(instance.get_counter()) # 输出更新后的类变量的值
静态方法:使用@staticmethod
装饰器定义,它们不接收self
或cls
参数,因此不能访问类或实例的属性。静态方法就像普通函数,但它们属于类的命名空间。
- 当你需要定义一个与类的具体实例无关的方法时。
- 当方法不需要访问类的属性或其他方法时。
- 用于实现与类相关的功能,而不是与实例相关。
class MyClass: @staticmethod def add(x, y): return x + y
# 通过类名调用
result = MyClass.add(5, 3) # 通过实例调用(实例在方法内部不会被使用)
instance = MyClass()
result = instance.add(10, 20) # 返回 30
-
构造方法和析构方法
构造方法(__init__
):当创建类的新实例时自动调用。用于初始化对象的状态。
class Person: def __init__(self, name): self.name = name
析构方法(__del__
):当对象被销毁时自动调用。Python的垃圾回收机制会自动处理对象的销毁,因此析构方法在Python中不如在其他语言中常见。
class Person: def __del__(self): print(f"Person {self.name} has been deleted.")
-
特殊方法
Python中还有许多特殊方法,它们用于自定义对象的行为,如字符串表示(__str__
)、比较操作(__eq__
, __lt__
, __gt__
等)和迭代(__iter__
, __next__
)等。
class Person: def __str__(self): return f"Person(name={self.name})"
__str__方法的作用类似C#中的重载toString()方法。
-
方法重写
子类可以重写父类的方法,以实现自己的行为:
class Base: def my_method(self): print("Base class method.") class Derived(Base): def my_method(self): print("Derived class method.") derived = Derived()
derived.my_method() # 输出: Derived class method.
-
继承
继承允许创建新类来扩展现有类的功能。子类可以继承父类的属性和方法,并可以添加新的属性和方法或重写现有的方法。
class Parent: def parent_method(self): print("这是父类的方法") class Child(Parent): def child_method(self): print("这是子类的方法") # 使用子类创建对象
child = Child()
child.parent_method() # 继承自父类的方法
child.child_method() # 子类自己的方法
-
封装
封装是面向对象编程的一个重要原则,它通过使用访问修饰符(如public
、private
、protected
)来控制对对象内部状态的访问。在Python中,通常使用单下划线(_
)前缀来表示受保护的属性或方法,双下划线(__
)前缀来表示私有属性或方法。
-
多态
多态允许将不同类的对象视为相同类型,只要它们实现了相同的接口。在Python中,这通常是通过定义虚方法(如__add__
、__mul__
等)来实现的。
class Animal: def speak(self): pass class Dog(Animal): def speak(self): return "汪汪汪" class Cat(Animal): def speak(self): return "喵喵喵" def make_animal_speak(animal): print(animal.speak()) dog = Dog()
cat = Cat()
make_animal_speak(dog) # 输出: 汪汪汪
make_animal_speak(cat) # 输出: 喵喵喵
在这个例子中,Dog
和Cat
类都实现了speak
方法,它们可以被统一处理,展示了多态性。