这一部分主要记录之前学这一块遗漏的一些东西
1、组合
这里如果用多继承的话,用水池继承乌龟和鱼,涉及到了不同物种,显然不太合适,这里就引入了组合的概念。
class Turtle:
def __init__(self,x):
self.num = x
class Fish:
def __init__(self,x):
self.num = x
class Pool:
def __init__(self,x,y):
self.turtle = Turtle(x)
self.fish = Fish(y)
def print_num(self):
print('水池里一共有乌龟 %d 条,鱼 %d 条' % (self.turtle.num, self.fish.num))
pool = Pool(1, 10)
pool.print_num()
运行结果 组合一般是把几个没有继承关系的几个类放在一起,就叫做组合(一般横向关系的几个类叫做组合,纵向关系的几个类叫做继承)。
2、类、类对象和实例对象
修改类对象的属性不会修改实例对象的属性 首先看一个例子
class C:
count = 0
a = C()
b = C()
c = C()
print("a,b,c实例化C后的count值为", a.count ,b.count, c.count)
c.count += 10
print("实例化对象c.count做加法后a,b,c的值", a.count ,b.count, c.count)
print("C类对象的count值", C.count)
C.count += 100
print("类对象C.count做加法后a,b,c的值", a.count ,b.count, c.count)
运行结果 对比上面的结果,可以发现对实例对象c的count属性赋值后,就相当于覆盖了类对象C的count属性。如果没有赋值覆盖,那么引用的是类对象的count属性。 类中定义的属性其实都是静态属性,对实例化对象的c的count进行修改时,并不会影响到类对象C的属性
如果属性的名字跟方法名相同,属性会覆盖方法
class C:
def x(self):
print("x方法")
c = C()
c.x()
c.x = 1
c.x()
这里在给实例化对象c的属性x赋值之后,这里的x属性将会覆盖x方法,调用c.x() 将会报错 小总结:不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展;用不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法等。
3、绑定
这里因为类对象定义的属性相当于静态变量,就算类对象被删除了,他们依然存储在内存当中,只有当程序退出后,内存才会被释放。在平常开发中,我们尽量使用实例对象的属性,减少使用类对象相关的操作(类对象属性相关操作一般用来跟踪与类有关的值)
|