Skip to content

类提供了数据和功能绑定在一起的方法,创建类即创建新的对象,对象是类的实例。实例可以维护自己的状态,通过方法改变状态。有点类似于带有 nonlocal 的函数,通过闭包维护内部的变量。

类的定义与实例化

python
class MyClass:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.gender = 'male'
    
    def say_hello(self):
        print(f'Hello, my name is {self.name} and I am {self.age} years old.')

    def say(self):
        self.say_hello()

类里面的 def 称之为方法,方法的第一个参数是 self,表示实例本身。

__init__ 是类的构造函数,在创建实例时自动调用。构造函数的参数需要再实例化的过程中进行传递。在构造函数中也可以对实例的属性进行初始化。

实例化类时,需要使用 类名() 的方式,在括号中传递构造函数的参数。

python
my_instance = MyClass('Alice', 25)
my_instance.say_hello()

类变量

类变量是类中定义的变量,可以通过类名直接访问,也可以通过实例访问。类变量在所有的实例中共享。如果是复杂数据类型可能出现意外的修改。

python
class MyClass:
    class_variable = 'class variable'

my_class = MyClass()
print(my_class.class_variable == MyClass.class_variable) # True

class Basic:
    class_list = []

    def add_item(self):
        self.class_list.append('item')

a = Basic()
b = Basic()

a.add_item()
print(a.class_list) # ['item']
print(b.class_list) # ['item'] # 意外的修改了 b 实例的 class_list

继承

python
class Base:
    def __init__(self, name):
        self.name = name
        
    def get_user_details(self):
        print(self.name)


class Child(Base):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def get_user_details(self):
        super().get_user_details()
        print(self.age)

    def say_hello(self):
        print('Hello, my name is', self.name)

child = Child('John', 25)
child.get_user_details()
child.say_hello()
  • 父类有的方法,子类没有的情况下,子类实例可以直接调用,类中进行调用需要使用 super() 调用父类的方法。
  • 子类可以重写父类的方法,也可以调用父类的方法。
  • 子类可以添加新的方法,也可以重写父类(同样的方法名)的方法。
  • 子类可以添加新的属性,也可以重写父类的属性。(不推荐)

多重继承