一、组合
定义:当几个对象是水平方向的时候,就应该考虑组合,当对象是纵向的时候用继承,组合就是用一个类把2个平级层次的类放在一起,然后实例化就可以了
#现在定义一个类,叫水池,水池里面有鱼和乌龟
class Turtle: def __init__(self,x): self.num = x class Fish: def __init__(self,y): self.num = y 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() 共有1只乌龟10条鱼 >>>
二、什么时候用组合,什么时候用继承
简单的说,组合用于“有一个”的场景,继承用于“是一个”的场景中。例如:水池有一只乌龟,水池有一条鱼,这样的就适合组合;女人是人,鲨鱼是鱼,这样的适合继承
三、类对象什么时候产生
类对象产生于类定义之后,类定义就变成了类对象,可以直接通过“类名.属性”,“类名.方法名()”引用或使用相关的属性或方法
四、如果对象的属性和方法名字相同,会怎样?
属性会覆盖方法
>>> class C: def x(self): print('Xman') >>> c = C() >>> c.x() Xman >>> c.x = 1 >>> c.x 1 >>> c.x() Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> c.x() TypeError: 'int' object is not callable
五、python严格要求方法需要有实例化才能被调用
>>> class BB: def printB(): print('no zuo no die') >>> bb = BB() >>> bb.printBB() Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> bb.printBB() AttributeError: 'BB' object has no attribute 'printBB' ----printBB()方法没有被实例化,所以调用失败
>>> class BB: def printBB(self): print('no zuo no die') >>> bb = BB() >>> bb.printBB() no zuo no die >>>
----方法只有被实例化,才能被调
六、在一个类中定义一个变量,用于跟踪该类有多少个实例被创建(当实例化一个对象,这个变量加1,当销毁一个变量,这个变量就自动减1 )
>>> class C: count = 0 def __init__(self): C.count +=1 def __del__(self): C.count -=1 >>> a = C() >>> b =C() >>> c =C() >>> C.count 3 >>> del a >>> C.count 2 >>> del b,c >>> C.count 0