17 多态 封装 反射

多态 此概念指出对象如何通过他们共同属性 动作进行访问 而不必考虑他们具体的事

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
')
f1.seek(0)
# print(f1.read())
原文地址:https://www.cnblogs.com/louzhiyuan/p/10452206.html