第22天(明天是面向对象的进阶)

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

  

原文地址:https://www.cnblogs.com/ylx900/p/8869951.html