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类以另外两个turtle类和fish类作为数据属性
>>> pool = pool(1,10)
>>>> pool.print_num()
水池里总共1只乌龟,10条鱼
2.类,类对象和实例对象
>>> class C:
count = 0
>>> a = C()
>>> b = C()
>>> c = C()
>>> a.count
0
>>> b.count
0
>>> c.count
0
>>> c.count +=10 '''此时实例对象c对count进行了修改,覆盖了类对象的count,所以下面c.count还是10'''
>>> c.count
10
>>> C.count +=100 '''对类对象的count进行修改'''
>>> a.count '''实例对象a与b的count没有进行修改,则会继续使用类对象象的count值,故下面a和b的count的值为100'''
100
>>> b.count
100
>>> c.count
10
如果属性的名字和方法的名字相同,属性的名字会覆盖方法的名字
>>> c = C()
>>> c.x()
X-man
>>> c.x = 1 '''对x属性进行声明'''
>>> c.x
1
>>> c.x() '''试图调用x方法'''
Traceback (most recent call last):
File "<pyshell#223>", line 1, in <module>
c.x()
TypeError: 'int' object is not callable
—不要试图在一个类里定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展
—用不同的词性命名,如属性名用名词,方法名用动词
3.什么是绑定?
Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。
>>> class bb:
def printbb(): '''注意!此处没有写self'''
print('123')
>>> bb.printbb()
123 '''类对象可以直接调用'''
>>> BB = bb()
>>> BB.printbb() '''然而没有了self,实例对象就无法调用了'''
Traceback (most recent call last):
File "<pyshell#230>", line 1, in <module>
BB.printbb()
TypeError: printbb() takes 0 positional arguments but 1 was given
当类对象被删除后,实例对象依然可以使用