python中类的设计问题(一些高级问题探讨,函数重载,伪私有,工厂模式,类方法等)

从这里再次体现了python语言强大的灵活性。某些在高级语言中看似不严谨需要尽量避免的地方在python中都是允许的。

比如:

(1),异常可以用来处理错误

(2),方法,类也都可以视为对象。

(3),没有任何的类型声明

可见,python中一切皆为对象,包括类,而类在C++,java中仅仅是编译器的输入而已。

1,函数重载

python因为没有类型声明,因此函数重载不能通过参数类型标记来实现。python中的多台是基于对象接口的,而不是类型。

 2,伪私有

python的伪私有属性:所谓伪私有,是指这么做仅仅避免了实例内的命名空间冲突,而不是限制变量名的读取

具体做法是,class语句内部有两个下划线,但是结尾没有两个下划线的变量名或者函数名,会自动扩张,从而包含了所在类的名称。比如:spam类中的__x这样的变量会自动变为_spam__x;

3,绑定或者无绑定方法

类进行点号运算得到无绑定方法,该方法对象必须传入明确的实例对象。

对象进行点号运算得到绑定方法,可以直接传入参数进行调用

class T:
    def x(self):
        print('test')

if __name__=='__main__':
    a=T()
    #print(dir(T))
    #print(T.__dict__.keys())
    y=a.x
    y();

    z=T.x
    z(y)

不过在3.0中,无绑定方法也不强制传入实例对象了

多重继承:

和c++、java等高级语言都不同

python可以进行多重继承,搜索属性时,pthon会从左到右搜索类首行中的超类,知道找到相符者。  

对于这一点,书上有一个很有用的打印类所有属性(包括从超类中继承的属性的方法),详见课本p768

python实现工厂设计模式

因为类也是对象,因此利用python实现工厂设计模式非常简单

def factory(aClass,*args):
    return aClass(*args)

第一个参数传入类名称,其他参数为类构造函数的参数即可

函数装饰器,类方法和静态方法

在python3.0中方法可以直接通过类名调用,视作不绑定方法,这就类似于了类方法。但是此时不能使用实例调用,因为默认实例将作为方法的第一个参数,而这样编写的类方法中没有参数可以接受

对应的方式使用@staticmethod进行修饰,这样通过类和实例都可以进行调用。

关于类装饰器和元类木有看懂,不过这些高级功能应当是对于工具编写者有用,对于程序员就没那么重要。

原文地址:https://www.cnblogs.com/bobodeboke/p/3337660.html