Day2面向对象进阶

访问可见性问题

在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头,下面的代码可以验证这一点。

# 私有变量,变量名前面加"__"
# 如果非要使用私有变量,那么可以使用dir(class())去查看它真正的名字.
# 私有变量/函数,在类内部可以直接调用.
# 如果你想体现一个变量/函数特别重要你可以使用"_"
class Test:

        def __init__(self, foo):
              self.__foo = foo

        def __bar(self):
              print(self.__foo)
              print('__bar')


def main():
      test = Test('hello')
      # AttributeError: 'Test' object has no attribute '__bar'
      test.__bar()
      # AttributeError: 'Test' object has no attribute '__foo'
      print(test.__foo)


if __name__ == "__main__":
     main()

@property装饰器

 使用装饰器的时候,需要注意:

    1. 装饰器名,函数名需要一致.

    2. property需要先声明,再写setter,顺序不能倒过来

    3. 如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property

    4. 如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.

class Person(object):

      def __init__(self, name, age):
            self._name = name
            self._age = age

      # 访问器 - getter方法
     @property
      def name(self):
           return self._name

     # 访问器 - getter方法
    @property
    def age(self):
          return self._age

      # 修改器 - setter方法
     @age.setter
     def age(self, age):
           self._age = age

def play(self):
      if self._age <= 16:
           print('%s正在玩飞行棋.' % self._name)
      else:
          print('%s正在玩斗地主.' % self._name)


def main():
      person = Person('王大锤', 12)
      person.play()
      person.age = 22
      person.play()
# person.name = '白元芳' # AttributeError: can't set attribute


if __name__ == '__main__':
     main()

"""
在python中类是动态的.
"""
class Num(object):
       def __init__(self):
           self.a = 1000

       def A(self):
            print(self.b)


num = Num()
num.b =1000000
# print(num.a)
print(num.b)
num.A()

猜你喜欢

转载自www.cnblogs.com/WANGRUNZE/p/11316510.html