面向对象编程:将变量或函数变私有(在名字前加两个下划线)
继承(支持多重继承):子类 <---- 基类,父类或超类(PS:如果在子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性)
重写__init__()方法:
-调用未绑定的父类方法
-使用super 函数
组合
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))
绑定:Python严格要求方法需要有实例才能被调用。
一些相关的BIF: issubclass(class,classinfo) , isinstance(object,classinfo) , hasattr() , getattr() , setattr() , delattr()
构造和析构:魔法方法总是被下划线包围,总能够在适当的时候被自动调用
第一个被调用的:__new__(cls[,...])
del x !=x.__del__() (在垃圾回收机制时被触发)
属性访问:
__getattr__ (试图访问不存在的属性时), __getattribute__ (属性被访问时), __setattr__ , __delattr__
描述符:将某种特殊类型的类的实例指派给另一个类的属性(实现__get__, __set__, __delete__)
>>> class MyDecriptor: def __get__(self,instance,owner): print("getting...",self,instance,owner) def __set__(self,instance,owner): print("setting...",self,instance,owner) def __delete__(self,instance): print("deleting...",self,instance) >>> class Test: x = MyDecriptor() >>> test = Test() >>> test.x
实现摄氏度和华氏度之间的转换:
class Celsius: def __init__(self,value=26.0): self.value = float(value) def __get__(self,instance,owner): return self.value def __set__(self,instance,value): self.value = float(value) class FaHrenheit: def __get__(self,instance,owner): return instance.cel*1.8+32 def __set__(self,instance,value): instance.cel = (float(value) - 32)/1.8 class Temperature: cel = Celsius() fah = FaHrenheit()
定制容器:
协议:相似于其他语言中的接口,但更像是一种指南。
不可变:__len()__ , __getitem__()
class Countlist(): def __init__(self,*args): self.values = [i for i in args] self.count = {}.fromkeys(range(len(self.values)),0) def __len__(self): return len(self.values) def __getitem__(self,key): self.count[key]+=1 return self.values[key]
可变:加上 __setitem__() , __delitem__()
迭代器(字典,序列):iter() --> __iter__() return self 使用在容器上就可使之成为迭代器, next() --> __next__() 定义迭代规则
for循环:
>>> string = 'haala' >>> it = iter(string) >>> while True: try: each = next(it) except StopIteration: break print(each) >>> for each in string: print(each)
>>> class Fibs: def __init__(self,n=20): self.a = 0 self.b = 1 self.n = n def __iter__(self): return self def __next__(self): self.a,self.b = self.b,self.a+self.b if self.a > self.n: raise StopIteration return self.a >>> fibs = Fibs() >>> for each in fibs: print(each)