类的私有属性和方法

Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的public,private 关键字来区分私有公有。

Python默认的成员函数和成员变量都是公开的,类的私有属性指只有在类的内部使用的属性或方法,表现形式为以“__“ 属性名或方法名以双下划线开头。

class Test(object):
  __count = 0  # 私有属性 __count

  def get_count(self):
    return self.__count  # 类的内部可以使用私有属性

  def set_count(self, value):
    if self.__check_value(value):  # 在类的内部调用类的私有方法
      self.__class__.__count = value

  def __check_value(self, value):  # 定义类的私有方法 检查参数
    if isinstance(value, int):
      return True

a = Test()
print(a.get_count())
a.set_count(100)
print(a.get_count())
#a.__check_value(10)  # 调用私有方法会报错
#print(a.__count)			# 直接访问私有属性也会报错

应用场景

对于一些敏感的数据,我们不希望直接被的函数调用,或者不希望草率的直接 object.key = value 来修改,我们可以选择将属性声名为私有的,这样从外部时无法访问该属性的,也就不能修改了,但是依然可以修改属性字典的方法来修改。

# 当然 可以使用 @proprety 
class Person(object):
  __name = 'Monkey'

  def update_name(self, name):
    self.__name = name

  def get_name(self):
    return self.__name

p = Person()
p.update_name('BlackMonkey')
print(p.get_name())  # BlackMonkey
print(p.__name)  # 报错 AttributeError: 'Person' object has no attribute '__name'

下面在看下python中私有属性和受保护的属性的实例代码

具体代码如下所示:

class People:
 
  def __init__(self, name, age):
    self.name = name
    self.age = age
    self._protect_var = 10       # 受保护的成员,使用一个下划线_,它仅仅是提示成员受保护,但可以被更改
    self.__private_var = 10       # 使用双下划线__可以定义私有属性
 
  def sayhi(self):
    print("Hi, my name is {}, and I'm {}".format(self.name, self.age))
 
  def get_var(self):
    print(self.__private_var)
 
  def set_var(self, var):
    self.__private_var = var
 
 
# class instance 类的实例化
 
someone = People(name='Jack', age=20)    # 类的实例化
print(someone._protect_var)         # 10 受保护的成员可以被打印
someone._protect_var = 20          # 受保护的成员可以被修改
print(someone._protect_var)         # 20 可以被修改
 
# print(someone.__private_var)          # 报错 AttributeError: 'People' object has no attribute '__private_var'
someone.__private_var = 30          # 此处可以被修改,不会报错(此处表示私有属性可以被修改,具体原因可以百度)
print(someone.__private_var)         # 可以打印,不会报错
 
someone.get_var()              # 10 此处可以发现,__private_var在上面被改成30,但此处打印出来却是10(具体原因可以百度)
someone.set_var(40)
someone.get_var()              # 40 这里通过someone.set_var(40)改成了40
 
print(dir(someone))             # dir()打印出someone这个对象支持的属性和方法
# ['_People__private_var', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__private_var', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_protect_var', 'age', 'get_var', 'name', 'sayhi', 'set_var']
# 在类的内部重命名了 __private_var重命名成_People__private_var
 
someone._People__private_var = 100
someone.get_var()              # 100 通过_People__private_var把__private_var的值改成了100

总结

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。