封装
复习:
1.接口类,python 中无接口类,有抽象类,通过abc模块中的metaclass=ABCMeta,abstractmeta
2.接口类和抽象类本质是代码规范用的,
3.接口类,抽象类的区别:再java的角度看,是有区别的,java没有多继承,所以为了接口隔离原则,设计了接口这个概念,
java本来就支持单继承,所以就有了抽象类,所以对接口类和抽象类区别不太明显,而python中既支持单继承也支持多继承,甚至在python中没有内置接口。
4.多态和鸭子类型
多态-------python天生支持多态
鸭子类型-----不依赖父类的情况下实现两个相似的类中的同名方法。
5.封装-------私有的
python中只要有__名字,就把这个名字私有化了,私有化后就不能直接从外部直接调用,这种私有化只是从代码级别做了变形,并没有真的约束
变形机制_类名__名字 ,在类外用这个调用,在类的内部可直接调用__名字。
6.静态属性,方法,对象属性,都可以私有化。
property 内置装饰器函数,只在面向对象中用
1.可以把方法伪装成属性(方法后面就不以传任何参数了)

from math import pi class Circle: def __init__(self,r): self.r = r @property-------------伪装方法为属性 def perimeter(self):-----------不可传任何参数 return 2*pi*self.r @property def area(self): return pi*self.r**2 circle = Circle(2) print(circle.perimeter)------------去了括号 print(circle.area)

class Person: def __init__(self,name): self.__name = name self.price = 20 @property -------------伪装 def name(self): return self.__name @name.deleter---------------删除 def name(self): del self.__name @name.setter----------修改名字 def name(self,new_name):------------有且只能有一个参数 self.__name = new_name b = Person('we') # del b.price # print(b.price) print(b.name) b.name = 're' print(b.name)
classmethod 内置装饰器
@classmethod,把一个方法变成一个类方法,就可以直接用类名调用。这个方法用于操作静态属性时候。
@staticmethod
在完全面向对象的程序中,如果一个函数既和对象没关系也和类美关系,那么就用staticmethod
类调用类方法和静态方法,
对象可以调用类方法和静态方法嘛?可以
类方法有一个默认参数 cls 代表这个类
静态方法没有默认参数,就像函数一样.
反射
通过反射:对象名 获取对象属性和普通方法,类名获取静态属性和类方法和静态方法
普通方法 self
静态方法 @staticmethod