python类的设计 - littleboy12580/learning_python GitHub Wiki

类的设计

伪私有属性

Python支持变量名压缩,让类内某些变量局部化,一般方法是:在class语句内开头有两个下划线,但结尾没有两个下划线的变量名会自动扩张,从而包含了所在类的名称

class C1:
    def meth1(self): self.__X = 88
    def meth2(self): print(self.__X)
class C2:
    def metha(self):self.__X = 99
    def methb(self): print(self.__X)
class C3(C1,C2): pass
I = C3()
I.meth1()
I.metha()
print(I.__dict__)
I.meth2()
I.methb()

运行结果为

{'_C2__X': 99, '_C1__X': 88}
88
99

委托

委托是指将对象包装在代理类中,使代理类增加额外的行为,从而把其他运算传给被包装的对象。代理类包含了被包装的对象的接口。在Python中,委托通常是以__getattr__钩子方法实现

class wrapper:
    def __init__(self,object):
        self.wrapped = object
    def __getattr__(self,attrname):
        print('Trace: ',attrname)
        return getattr(self.wrapped,attrname)

多重继承

mro机制

  • 在传统类(Python2.3以前)中,属性搜索处理对所有路径深度优先,直到继承树的顶端,然后从左到右进行
  • 在新式类中,采用广度优先搜索

工厂函数

可以把类传给会产生任意种类对象的函数,这样的函数在OOP设计领域中称为工厂

def factory(aClass,*args,**kwargs):
    return aClass(*args,**kwargs)
⚠️ **GitHub.com Fallback** ⚠️