本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
python类的私有属性和公共属性说明
iamitnan · 196浏览 · 发布于2022-05-10 +关注

这篇文章主要介绍了python类的私有属性和公共属性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python类私有属性和公共属性

对于python而言,类的属性的可见度只有两种,public和private。

类的私有属性便是在前面加上“__”标识符,而公共属性则不必。

在类的外面访问私有属性会引发异常。

class Base:
    def __init__(self, value):
        self.__value = 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 <module>
    print(b.__value)
AttributeError: 'Base' object has no attribute '__value'


属性被私有化,即使继承他的字类也不能访问到。 

class Parent:
    def __init__(self, value):
        self.__value = 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 <module>
    print(child.get_value())
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 21, in get_value
    return self.__value
AttributeError: '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 = 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 = 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=name
        self.kind=kind
        self.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进行私有限定。  

 


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1327浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 912浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 976浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 965浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1092浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页