zoukankan      html  css  js  c++  java
  • 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进行修饰,这样通过类和实例都可以进行调用。

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

  • 相关阅读:
    学习《Spring 3.x 企业应用开发实战》Day-1
    java面试32问
    线程的同步和异步
    TCP和UDP的区别
    深入理解Spring系列之四:BeanDefinition装载前奏曲
    深入浅出JDK动态代理(一)
    和大牛之间的差距
    深入理解Spring系列之三:BeanFactory解析
    深入理解Spring系列之二:BeanDefinition解析
    深入理解Spring系列之一:开篇
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3337660.html
Copyright © 2011-2022 走看看