day26:静态方法,类方法和反射

1,包内部不要去尝试应用使用相对导入,一定不会成功的,他不支持这个机制,包内导入时一定要用绝对导入

2,复习接口类,抽象类,Python中没有接口类,有抽象类,抽象类是通过abc模块中的metaclass = ABCMeta 和@abstractmethod实现的

3,接口类和抽象类本质是做代码规范用的,我希望在子类中实现和父类方法名完全一样的方法

4,二者区别,在JAVA的角度看是有区别的,JAVA没有多继承,所以为了接口隔离原则,就设计了接口这个概念,支持多继承;JAVA本来就支持单继承,所以就有了抽象类。Python中既支持单继承,也支持多继承,所以对于接口类和抽象类的区别就不那么明显了。甚至在Python中根本没有接口类,但是Python的扩展模块中有一个模块确实实现了接口类的概念,所以不能说根本没有,只是内置模块中没有,没有内置接口类。

5,多态和鸭子类型,多态---Python天生支持多态,给子类找个爸爸,传爸爸的参数,Python里面崇尚鸭子类型,不依赖父类的情况下,实现两个类中的同名方法。

6,封装 ---私有的,在Python中只要__名字,就把这个名字私有化了,私有化之后,就不能从类的外部直接调用了,可以私有的有静态属性方法,对象的属性都可以私有化,这种私有化只是从代码级别做了变形,并没有真的约束,变形机制 _类名__方法。在类外用这个调用,在类的外部__名字调用。

7,私有属性

class Room:
    def __init__(self,name,length,width):
        self.name = name
        self.__length =length
        self.__width = width
    
    def area(self):
        return self.__length * self.__width

jin = Room('jin',3,5)
print(jin.area())
jin.name = 'lisa'
print(jin.name)

8,get set 方法保护属性不被修改,私有属性的查看方法

class Room:
    def __init__(self,name,length,width):
        self.__name = name
        self.__length =length
        self.__width = width

    def get_name(self):
        return self.__name

    # 对私有对象的保护
    def set_name(self,new_name):
        if type(new_name) is str and new_name.isdigit() == False:
            self.__name = new_name
        else:
            print('invalid name')

    def area(self):
        return self.__length * self.__width

jin = Room('jin',3,5)
jin.name = '2' # 不是私有的话,可以随便改,要想办法约束一下
print(jin.name)

jin.set_name('lisa')
print(jin.get_name())
# C++ 里面所有的属性都设置成私有的,

 9,父类的私有属性可以被子类调用吗?否

class Foo:
    __key = '123'  _Foo__key

class Son(Foo):
    print(Foo.__key) #_Son__key # 此句报错,由于不可以调用 
# AttributeError: type object 'Foo' has no attribute '_Son__key

10,总结:会用到私有概念的场景,隐藏起一个属性,不想让类的外部调用;我想保护这个属性,不想让属性随意被改变;我想保护这个属性不被子类继承

11,之前老师欠着的三个内置函数:property,classmethod,staticmethod

猜你喜欢

转载自www.cnblogs.com/lisa-blog/p/10247874.html
今日推荐