本章开始介绍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方法,它们可以被统一处理,展示了多态性。