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