【Python学习日记】B站小甲鱼:组合,绑定和常见的IBF
组合
定义一个水池,包含🐟和🐢。
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(10,1) pool.print_num()
结果就输出
水池里有10只乌龟,1条鱼
所以可以发现组合,就是把类和实例化放到一个新类里面,就会生成一个组合的类了。
组合可以把几个不是太相关的类放在一起。如果是相关的类可以使用继承。
类
class C: count = 0 a = C() b = C() print(a.count) print(b.count) print("*") b.count+=10 print(a.count) print(b.count) print("*") C.count +=100 print(a.count) print(b.count) print(C.count)
输出结果是
0
0
*
0
10
*
100
10
100
当b.count()+=10的时候相当于生成了一个count()方法覆盖了基类的方法,所以b.count()的值改变了
如果属性和方法的名字相同,那么属性会把方法覆盖掉。因此,要多使用组合和继承扩展类的属性,尽量减少在一个类中定义过多的属性。
绑定
Python要求有实例,方法才能调用。这种限制就是Python的绑定。
有self就不用管了。
一些相关的IBF
issubclass(class,classinfo) 如果后一个类是前一个类的父类,则返回true。但这种检查是非严格的检查,一个类被认为是自身的子类。classinfo可以是类对象的元组,只要class与其中任何一个候选类的子类,则返回True
isinstance(object,classinfo) 检查实例object是否属于类classinfo
hasattr(object,name) 检查一个对象是否有对应的属性,变量名需要用 ‘ ’ 以字符串的方式表示
getattr(object,name) 是否有指定的属性值,如果有就返回属性值,否则报告attribute Erorr错误
setattr(object,name,value) 同上,如果不存在属性值,把value的值赋予它
delattr(object,name) 删除类中的属性,如果属性不存在就抛出异常
property(fget,fset,fdel) 设置一个属性。参数分别是获得属性的方法,得到属性值的方法和删除属性的方法