1、封装
简而言之,在类中的属性变量(函数)名以双下划线开头的就是封装,格式为:
__A。
其作用就是一个保护作用,外部不能直接调用(当然只是个规定)
class Abc:
def __init__(self, a):
self.__a = a
def __abc(self):
print('你调不到我')
这是格式。但是若真的想在外部调用这种变量的话,用_类名__变量名的方法;这里用
_Abc__a, _Abc_abc
进行实例化:
a = Abc(10)
a._Abc__a -------> 这个是10
a._Abc__abc -----------> 这个是 你调不到我 这句话
这些种方法不要用,会被大佬打死。虽然是真的可以调用
2、property
用两个字概括它的功能,就是伪装。
property一般作为装饰器使用(反正现在为止是这样的)
如上例:
class Abc:
def __init__(self, a):
self.__a = a
@property
def name(self):
return self.__a
此时调用用 :
a.name ----------> 10
代替上面的a._Abc__a(有效的防止被大佬打,还能看上去很像是一个__init__里的属性)
此处应注意:property装饰的函数不能有除了self以外的参数
3、classmethod与staticmethod
这二者都是作为装饰器在类内使用的:
@classmethod
可以用作修改静态变量
class Goods:
__count_off = 0.8
def __init__(self, price ,name):
self.__price = price
self.name = name
@property
def price(self):
return self.__price * Goods.__count_off
@classmethod
def change(self, a):
Goods.__count_off = a
apple = Goods(5, 'apple')
banana = Goods(8,'banana')
Goods.change(1)
print(apple.price)
print(banana.price)
classmethod用老师的原话说是 类方法 可以直接被类调用 不需要默认传对象参数 只需要传一个类参数就可以了
个人理解是确实是个类方法,因为没这东西不能写Goods.change(1),只能用apple.change(1)或者是banana.change(1)来改
其次,def change(self, a):
Goods.__count_off = a
这里的self可以换成别的名字,Goods也可以随之变动,如:
def change(b, a):
b.__count_off = a
@staticmethod下面的函数无默认参数self,就当作是在外部定义的函数来用就ok