类
类提供了数据和功能绑定在一起的方法,创建类即创建新的对象,对象是类的实例。实例可以维护自己的状态,通过方法改变状态。有点类似于带有 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()
调用父类的方法。 - 子类可以重写父类的方法,也可以调用父类的方法。
- 子类可以添加新的方法,也可以重写父类(同样的方法名)的方法。
- 子类可以添加新的属性,也可以重写父类的属性。(不推荐)