多态 此概念指出对象如何通过他们共同属性 动作进行访问 而不必考虑他们具体的事
class H2O: def __init__(self,name,temperature) def turn_ice(self): class Water(H2O): class Ice(H2O): class Steam(H2O): w1 = Water('水',25) w1.turn_ice()
如同数据类型的
s.__len__() list.__len__()
第一个层面的封装 类就是麻袋 这本身就是一种封装
第二个层面的封装 类中定义私有的 只有在你类的内部访问 外部无法访问
第三个层面的封装 明确却分内外 内部的实现逻辑 外部无法知晓
并且为封装到内部的逻辑提供一个访问接口给外部使用
class Room: def __init__(self,name,owner,width,length,high): self.name =name self._width = width def area(self): return self._width * self._length r1 = Room('卫生间','alex',100,100,10000) print(r1.tell_area())
面向对象是一种更高级的结构化编程方式 好处
1 通过封装明确了内外 作为类的缔造者 你是上帝 上帝造物的逻辑无需知道
上帝想让你知道的你才能知道 这样就明确了等级
2 通过继承 多态 在语言层面支持了归一化设计
反射 1982年提出 指程序可以访问 检测 修改它本身状态或者行为的一种能力
class BlackMedium: feture = 'ugly' def __init__(self,name,addr): self.name = name self.addr = addr def sell_house(self): print('%s 正在卖房子'%self.name) b1 = BlackMedium('万成置地','天露园') # print(getattr(b1,'name')) #返回内存地址或者内容 # print(getattr(b1,'sell_house')) # print(hasattr(b1,'name')) #返回布尔值 # print(hasattr(b1,'rent_house')) # print(setattr(b1,'sb',True)) #添加 # print(b1.__dict__) # del b1.sb #delete # print(b1.__dict__) # setattr(b1,'func',lambda self:self.name + 'sb') #change # print(b1.func(b1))
类内置的attr属性
class Foo: x = 1 def __init__(self,y): self.y = y def __getattr__(self,item): print('执行__getattr__') def __setattr__(self, key, value): Foo.__dict__[key] = value print('执行__getattr__') def __hasattr__(self,item): print('执行__getattr__') def __delattr__(self,item): print('bu执行__getattr__') print('no!!!!you can not') f1 = Foo(10) print(f1.y) print(getattr(f1,'y'))
#只有在属性不存在时 自动触发gateattr
# 删除属性时候会触发delattr
# 设置属性时候会触发setattr
继承方式完成包装
class List(list): def append(self,p_object): if type(p_object) is str: super().append(p_object) else: print('only str can be add') def show_middle(self): mid_index = int(len(self)/2) return self[mid_index] pass # l2 = List('hello world') # print(l2,type(l2)) l1 = List('helloworld') # print(l1,type(l1)) # print(l1.show_middle()) l1.append('abc') l1.append(1) print(l1)
授权
以组合方式加入
import time class FileHandle: def __init__(self,filename,mode = 'r',encoding = 'utf-8'): self.file = open(filename,mode,encoding =encoding) self.mode =mode self.encoding = encoding def write(self,line): print('____>',line) t = time.strftime('%Y-%m-%d %X') self.file.write('%s %s'%(t,line)) def __getattr__(self, item): return getattr(self.file,item) f1 = FileHandle('a.txt','r+') # print(f1.__dict__) # print("==>>",f1.read) #触发getattr f1.write('111111111\n') f1.seek(0) # print(f1.read())