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

作者:yangjiajia123456 时间:2021-04-07 11:03:59 

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进行私有限定。 

来源:https://blog.csdn.net/yangjiajia123456/article/details/80383475

标签:python,私有属性,公共属性
0
投稿

猜你喜欢

  • PHP对战ASP:这还值得讨论吗

    2008-04-16 14:19:00
  • python工具之清理 Markdown 中没有引用的图片

    2022-02-14 11:44:39
  • 微软证实最新的关键SQL Server漏洞

    2008-12-23 13:31:00
  • 在Mac OS系统上安装Python的Pillow库的教程

    2021-09-29 15:03:26
  • 用python将word文档合并实例代码

    2021-08-13 06:17:01
  • 如何做一个计数器并让人家申请使用?

    2010-07-11 21:13:00
  • Python中装饰器的基本功能理解

    2021-05-26 05:17:56
  • Pytorch数据读取与预处理该如何实现

    2021-12-23 17:44:35
  • 使用ewebeditor可能会重复提交数据两次的解决办法

    2009-01-09 12:41:00
  • python实现微信每日一句自动发送给喜欢的人

    2022-10-13 02:09:25
  • 文本框textarea限制输入文字个数的方法

    2008-01-28 13:02:00
  • ASP网站程序自动升级实现的方法

    2008-10-15 14:28:00
  • sql ntext数据类型字符替换实现代码

    2011-09-30 11:08:00
  • python神经网络特征金字塔FPN原理

    2023-12-20 02:21:01
  • Django 使用VScode 创建工程的详细步骤

    2023-02-01 02:49:19
  • python 实现Harris角点检测算法

    2023-08-03 08:08:31
  • 解析一个通过添加本地分区索引提高SQL性能的案例

    2023-07-22 13:29:32
  • Django跨域请求CSRF的方法示例

    2021-07-13 21:09:34
  • FCKeditor 编辑器实战技巧 Ⅰ

    2008-10-08 10:22:00
  • 利用phpExcel实现Excel数据的导入导出(全步骤详细解析)

    2023-06-22 02:56:42
  • asp之家 网络编程 m.aspxhome.com