上篇主要介绍了类中的变量的定义与各种特性,本篇将开始介绍类中的方法。
目录
1、定义函数
有别于C中的结构体,类中可以直接定义函数:
class Zoo:
def dog_say(self):
print("汪汪汪")
dog = Zoo()
dog.dog_say()
2、函数参数
在类中的函数都有一个参数self,这个self其实就是实例对象本身,作用在于绑定一个实力对象,相当于提供第一个地址。
class Zoo:
def dog_say(self):
print(self)
dog = Zoo()
dog.dog_say()
print(dog)
self就是实例对象本身, 通过这个self绑定实例对象,从而实现操作只针对该实例对象。
3、构造函数
书接上文,self的特点在构造函数中大显身手。在类中我们可以使用__init__构造函数,使用__dict__方法可以查看实例对象中的变量。
class Zoo:
def __init__(self, x, y):
self.a = x
self.b = y
def plus(self):
print(self.a + self.b)
zoo1 = Zoo(1, 1)
# 此时就应该加入参数
print(zoo1.__dict__)
zoo1.plus()
zoo2 = Zoo(2, 2)
print(zoo2.__dict__)
zoo2.plus()
不难得出,self的作用在于连接实例对象与操作,self就是实例对象本身(self.a == zoo1.a)。
4、嵌套类
书接上文,继续用到self,Python中可以嵌套类,定义如下:
class Dog:
def say(self):
print("汪汪汪")
class Cat:
def say(self):
print("喵喵喵")
class Zoo:
dog = Dog()
cat = Cat()
def say(self):
self.dog.say()
self.cat.say()
zoo = Zoo()
zoo.say()
self.dog.say()和self.cat.say()如果不加self就会报错,此时self就是zoo。
5、super方法
在继承中,要避免多重继承的问题:
class A:
def __init__(self):
print("I am A~")
class B1(A):
def __init__(self):
A.__init__(self)
print("I am B1~")
class B2(A):
def __init__(self):
A.__init__(self)
print("I am B2~")
class C(B1, B2):
def __init__(self):
B1.__init__(self)
B2.__init__(self)
print("I am C~")
c = C()
我们可以看到A被调用了两次,有点类似于链式法则,为了避免这种情况,可以使用super方法。
将代码修改为:
class A:
def __init__(self):
print("I am A~")
class B1(A):
def __init__(self):
super().__init__()
print("I am B1~")
class B2(A):
def __init__(self):
super().__init__()
print("I am B2~")
class C(B1, B2):
def __init__(self):
super().__init__()
print("I am C~")
c = C()
A不再被调用两次,super方法避免了重复调用。
6、Mix-in
Mixin可以译为混入,就是在不改变原对象的情况下对其进行扩展,利用继承的方法实现:
假设我们原来有类A:
class A:
def say(self):
print("生活就像海洋")
我们想让类A在打印一句“只有意志坚强的人才能到达彼岸”,我们可以增加类B,让A继承B,从而实现该操作:
class B:
def say(self):
print("只有意志坚强的人才能到达彼岸")
class A(B):
def say(self):
print("生活就像海洋")
B.say(self)
a = A()
a.say()