python类的私有属性和公共属性说明

目录

  • python类私有属性和公共属性
  • python私有属性的定义

python类私有属性和公共属性 【python类的私有属性和公共属性说明】对于python而言,类的属性的可见度只有两种,public和private。
类的私有属性便是在前面加上“__”标识符,而公共属性则不必。
在类的外面访问私有属性会引发异常。
class Base:def __init__(self, value):self.__value = https://www.it610.com/article/value b = Base(5)print(assert b.__value) Traceback (most recent call last):File"/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 19, in print(b.__value)AttributeError: 'Base' object has no attribute '__value'

属性被私有化,即使继承他的字类也不能访问到。
class Parent:def __init__(self, value):self.__value = https://www.it610.com/article/value class Child(Parent):def get_value(self):return self.__value child = Child(4)print(child.get_value()) Traceback (most recent call last):File"/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 24, in print(child.get_value())File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 21, in get_valuereturn self.__valueAttributeError: 'Child' object has no attribute '_Child__value'

为何会这样?因为python会对类的私有属性做些转换,以保证private字段的私密性。当编译器看到Child.get_value方法要访问私有属性时,他会先把__value变换为_Child_value然后再进行访问,但实际上该私有属性是_Parent__value。字类无法访问父类的私有属性,只是因为访问的名称不同。
查询该对象的属性字典便知
class Parent:def __init__(self, value):self.__value = https://www.it610.com/article/value class Child(Parent):def name(self):names ='yang' def get_value(self):return self.__value child = Child(4)print(child.__dict__) {'_Parent__value': 4}

python开发的原则还是要少用私有属性,如果需要保证属性不重复,可以在其前面加上单个下划线。
class Parent:def __init__(self, value):self._value = https://www.it610.com/article/value class Child(Parent):def get_value(self):return self._value child = Child(4)assert child._value == 4


python私有属性的定义 在Java中用private对变量或者方法进行限定,则方法仅在整个类内部可见,外部不可见、不可访问。
在python中也有私有属性定义,使用函数名前缀的两个下划线进行定义。
例如 __parameter
接下来看上一个Dog的例子
class Dog(object):__slots__ = ('__name', 'kind', 'level')def __init__(self,name,kind,level):#构造函数,定义属性和初始方法self.__name=nameself.kind=kindself.level=level#赋值print(f"This is a {self.kind} dog called {self.__name} with level {self.level}") def run(self):#定义类中的方法print(f"{self.__name} is now running!") def roll_over(self):print(f"{self.__name} is now rolling over!") def change_level(self):self.level+=1#修改类中属性的值print(f"The level of {self.__name} is now {self.level}")

在另一个文件里面进行调用
from Zoo.Dog import Dog#导包 dog=Dog("Halo","Husty",3)#实例化 dog.run()dog.roll_over()dog.change_level()#调用方法

发现当我们输入以下内容时,会报错,非法访问。
print(dog.__name)

在本例中,__name是对name进行私有限定。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读