Python类的私有属性和公共属性怎样理解
Admin 2022-09-05 群英技术资讯 1324 次浏览
这篇文章主要介绍“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
在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进行私有限定。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python JSON模块的使用详情,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写下面文章围绕Python JSON模块的相关资料展开内容,需要的小伙伴可以参考一下,希望 对你有所帮助
这篇文章给大家分享的是有关python的print函数怎么用的内容。print函数是一个比较实用的函数,新手学习Python是需要掌握的,因此分享给大家做个参考,接下来一起跟随小编学习一下吧。
这篇文章给大家分享的是pytorch深度神经网络的相关内容,下文将介绍pytorch深度神经网络的基础概念,数据预处理手段,数据处理库,训练集、测试集,测试集等等这些,对大家学习和理解pytorch深度神经网络会有帮助,感兴趣的朋友跟随小编继续学习吧。
这篇文章主要给大家分享python中的四个高级数据类型,分别是字符,元组,列表,字典,下文实例介绍的很详细,对大家学习和理解python数据类型有一定的帮助,有需要的朋友可以参考,接下来跟随小编一起学习一下吧。
len()函数返回对象的长度参数可以是序列(字符串str、元组tuple、列表list)或集合(字典dict、集合set或冻结集合frozenset)
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008