首页 新闻 搜索 专区 学院

关于Python中的私有属性的疑问。

0
[已解决问题] 解决于 2017-07-29 20:44

老师讲:私有属性在外部是不可以访问的,下面程序中的age已经定义为私有属性。

如果没有p1.__age=23这一步,直接运行print,则会报错。

但是如果有了p1.__age=23赋值这一步,居然可以赋值,然后正常执行。

本人小白,请教各位,是不是我的理解哪里有问题。

代码:

class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.__age=age
def got_shot(self):
print("ah...,I got shot...")

p1=Person('Lily',22)
p1.__age=23
print(p1.__age)

运行结果:
23
momo8238的主页 momo8238 | 初学一级 | 园豆:158
提问于:2017-07-28 16:08
< >
分享
最佳答案
0

访问不到是对;但是p1.__age=23 这一步赋值,给了一个__age属性给p1对象,这个__age 和 __init__函数中的__age 不是一个属性;

如果要测试__age 是否访问到,应该直接访问;例如我下面的代码:

class Person:
    cn = "China"

    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def got_shot(self):
        print("ah...,I got shot...")


p1 = Person('Lily', 22)
# p1.__age = 23
print(p1.__age)

执行的时候报错:
AttributeError: 'Person' object has no attribute '__age'
这说明私有属性访问不到是对的
奖励园豆:5
悟行 | 专家六级 |园豆:12429 | 2017-07-28 16:38

小白谢谢大侠的回复。

直接打印 print(p1.__age) ,这里面的p1.__age值得就是__init里面的那个。

如果我赋值给p1.__age = 23,这个p1.__age 相当于一个新的变量?

好像大概明白了,但是还有一些迷糊。像您所说的,p1.__age=23 这个p1.__age不是__init里面的那个age, 那么我想问一下,如果我想访问__init里面的那个age,应该怎么写表达式呢??

问得有点啰嗦,希望大侠不要介意。

momo8238 | 园豆:158 (初学一级) | 2017-07-28 20:30

@momo8238: p1.__age=23 这个p1.__age不是__init里面的那个age ,对的,就是这个意思,你可以把__init里面的那个__age除掉,测试一下

悟行 | 园豆:12429 (专家六级) | 2017-07-29 11:00

@momo8238:  __slots__ = ('name') # 用tuple定义允许绑定的属性名称;

可以用__slots__ 限制外面只能有name属性

悟行 | 园豆:12429 (专家六级) | 2017-07-29 11:02
class Person:
    cn = "China"
    def __init__(self, name, age):
        self.name = name
        #self.__age = age
        
    def got_shot(self):
        print("ah...,I got shot...")

p1 = Person('Lily', 22)
p1.__age = 23
print(p1.__age)

运行结果:23

 

@抽象ID: 您说的对,我把这句注释掉以后#self.__age = age,p1.__age = 23还可以正常赋值,说明此时p1.__age = 23是一个新的变量。

以此为鉴,希望以后不要再掉到这个坑里。更深层次的原因,此时还不太明白。

谢谢@抽象ID

 


 

momo8238 | 园豆:158 (初学一级) | 2017-07-29 20:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册