Python中的私有属性与私有方法
  oELtfgAoDdFJ 11天前 21 0

关于Python中的私有属性和私有方法

Python对于类的成员没有严格的访问控制限制,这与其他面相对对象语言有区别。关于私有属性和私有方法,有如下要点:

1、通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public);
2、类内部可以访问私有属性(方法);
3、类外部不能直接访问私有属性(方法);
4、类外部可以通过 _类名__私有属性(方法)名访问私有属性(方法)

定义私有属性/方法

class Demo:
    __price = 25.8

    def __init__(self, u_name, u_age):
        self.uname = u_name
        self.__uage = u_age

    def __age(self):
        print("这是私有方法")
        print("调用共有属性:", self.uname)
        print("调用私有属性:", self.__uage)
        print("调用私有类属性:", self.__price)

    def name(self):
        print("这是公有方法")
        print("调用共有属性:", self.uname)
        print("调用私有属性:", self.__uage)
        print("调用私有类属性:", self.__price)

使用 dir()函数可以查看对象内的所有的属性和方法

在 python 中任何东西都是对象,一种数据类型,一个模块等,都有子集的属性和方法,除了常用的方法外,其他的你不需要全部记住它,交给 dir() 函数就好了。

d = Demo('Tom', 18)
print(dir(d))
"""
['_Demo__age', '_Demo__price', '_Demo__uage', '__class__', '__delattr__', '__dict__', 
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',  '__str__', 
'__subclasshook__', '__weakref__', 'name', 'uname']
"""

这些打印出来的属性(方法)是可以直接调用的。从打印的结果可以看到,私有属性 __age()__price__uage 这三个私有属性(方法)都变成了 _Demo__age, _Demo__price, _Demo__uage,也就可以看出,私有属性(方法)在Python中是不允许直接去调用的,类外部可以通过 ”_类名__私有属性(方法)名“ 访问私有属性(方法)

调用属性(方法)

# 调用共有方法
d.name
"""
这是公有方法
调用共有属性: Tom
调用私有属性: 18
调用私有类属性: 25.8
"""
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
# 调用私有方法(错误示范)
d.__age()
"""
Traceback (most recent call last):
  File "D:/Local/PycharmProjects/private_obj/demo.py", line 32, in <module>
    d.__age()
AttributeError: 'Demo' object has no attribute '__age'
"""

# 调用私有方法(正确示例)
d._Demo__age()
d._Demo__
"""
这是私有方法
调用共有属性: Tom
调用私有属性: 18
调用私有类属性: 25.8
"""

# 调用私有属性
print(Demo._Demo__price) # 25.8
print(d._Demo__uage) # 18

【注】方法本质上也是属性!只不过是可以通过()执行而已。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 11天前 0

暂无评论

推荐阅读
  KmYlqcgEuC3l   4天前   20   0   0 Python
  KmYlqcgEuC3l   3天前   11   0   0 Python
  KmYlqcgEuC3l   2天前   7   0   0 Python
oELtfgAoDdFJ