老师讲:私有属性在外部是不可以访问的,下面程序中的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
访问不到是对;但是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)
执行的时候报错:
小白谢谢大侠的回复。
直接打印 print(p1.__age) ,这里面的p1.__age值得就是__init里面的那个。
如果我赋值给p1.__age = 23,这个p1.__age 相当于一个新的变量?
好像大概明白了,但是还有一些迷糊。像您所说的,p1.__age=23 这个p1.__age不是__init里面的那个age, 那么我想问一下,如果我想访问__init里面的那个age,应该怎么写表达式呢??
问得有点啰嗦,希望大侠不要介意。
@momo8238: p1.__age=23 这个p1.__age不是__init里面的那个age ,对的,就是这个意思,你可以把__init里面的那个__age除掉,测试一下
@momo8238: __slots__ = ('name') # 用tuple定义允许绑定的属性名称;
可以用__slots__ 限制外面只能有name属性
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