访问可见性问题和@property装饰器

Posted honey-2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问可见性问题和@property装饰器相关的知识,希望对你有一定的参考价值。

1、访问可见性问题

在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。如下所示:

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

技术图片

2、@property装饰器

      之前我们讨论过Python中属性和方法访问权限的问题,我们不建议将属性设置为私有的,而是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作,这是就考虑使用@property包装器来包装getter和setter方法。如下所示:

  # 使用装饰器的时候,需要注意:
     # 1. 装饰器名,函数名需要一致.
    # 2. property需要先声明,再写setter,顺序不能倒过来
    # 3. 如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property
    # 4. 如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.

#输入三个数字(私有),求三个数字的和,尝试更改其中两个数字:

技术图片

案例一:

  # 显示“小怪兽喜欢奥特曼”

  # 通过输入密码,修改内容

------------------------------------------------------------------------------------------------------

class spacei(object):
  def __init__(self):
    self.__a="小怪兽喜欢奥特曼"
    self.__mima="000000"   # 设置密码
  @property      # 访问器 - getter方法
  def A(self):
    print(self.__a)
  @A.setter     # 修改器 - setter方法
  def A(self,a):
    self.__a=a
  def mima(self):
    print("请输入密码:")
    res=input("")
    if res == self.__mima:   # if语句判断res == self.__mima是否相等,如果相等更改内容
      print("密码输入正确,请更改隐私内容!")
      a=input("")
      self.A=a
      print("内容成功修改为",self.__a)
    else:
      print("密码输入错误,请重新输入:")
      self.mima()
  def wer(self):
    print("你想更改还是退出?")
    we = input("")
    if we == "更改":
      self.mima()
    else:
      pass
Space=space()
Space.A
Space.wer()

------------------------------------------------------------------------------------------------------

以上是关于访问可见性问题和@property装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python中的property类和@property装饰器

面向对象之封装 及@property装饰器使用

二十三Python 中 property() 函数及 @property 装饰器的使用

第一次访问后缓存返回值的类方法的装饰器

Python,如何添加另一个装饰器来过滤现有多装饰器的输出与python中的属性?

Python的黑魔法@property装饰器的使用技巧