Python __setattr\uuuuuuuuuu正在破译代码?
这是我的密码Python __setattr\uuuuuuuuuu正在破译代码?,python,setattr,Python,Setattr,这是我的密码 class Human(object): def __init__(self, name, gender): self.name = name self.gender = gender print 'Hi there, I am '+ self.name def ThankHeavens(self): return 'Thanks Gods!' class Soldier(Human): def __init__(self, name
class Human(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
print 'Hi there, I am '+ self.name
def ThankHeavens(self):
return 'Thanks Gods!'
class Soldier(Human):
def __init__(self, name, gender, rank):
super(Soldier, self).__init__(name, gender)
self.rank = rank
print self.rank + ' reporting!'
class Officer(Soldier):
def __init__(self, name, gender, rank, num_subordinates):
super(Officer, self).__init__(name, gender, rank)
self.num_subordinates = num_subordinates
def __setattr__(self, rank, value):
if rank not in ['lieutenant', 'captain', 'major', 'colonel', 'commander', 'admiral']:
print 'Invalid officer rank'
else:
super(Officer, self).__setattr__(rank, value)
每当我尝试创建一个官员时,它就会中断:
helo = Officer(name='Agathon',
gender='m',
rank='lieutenant',
num_subordinates=0)
Traceback (most recent call last):
File "hw7.py", line 39, in <module>
num_subordinates=0)
File "hw7.py", line 20, in __init__
super(Officer, self).__init__(name, gender, rank)
File "hw7.py", line 14, in __init__
super(Soldier, self).__init__(name, gender)
File "hw7.py", line 7, in __init__
print 'Hi there, I am '+ self.name
AttributeError: 'Officer' object has no attribute 'name'
helo=Officer(name='Agathon',
性别='m',
上尉,
num_下属=0)
回溯(最近一次呼叫最后一次):
文件“hw7.py”,第39行,在
num_下属=0)
文件“hw7.py”,第20行,在_init中__
超级(军官,自我)。\uuuu初始(姓名、性别、职级)
文件“hw7.py”,第14行,在_init中__
超级(士兵,自我)。\uuuu初始(姓名,性别)
文件“hw7.py”,第7行,在_init中__
打印“你好,我是”+self.name
AttributeError:'Officer'对象没有属性'name'
为什么它不能识别我在定义helo时输入的名称?您没有发布的是您的
\uuuu setattr\uuuu
创建的两条消息:
Invalid officer rank
Invalid officer rank
这些来自以下几行:
self.name = name
self.gender = gender
由于这些操作失败,以后无法检索名称:
print 'Hi there, I am '+ self.name
修正:
您没有发布的是您的
\uuuuu setattr\uuuuu
创建的两条消息:
Invalid officer rank
Invalid officer rank
这些来自以下几行:
self.name = name
self.gender = gender
由于这些操作失败,以后无法检索名称:
print 'Hi there, I am '+ self.name
修正:
如果在任何时候以任何方式设置了
官员
的任何属性,包括在通过超类\uuuuu init\uuuu
初始化的过程中,将调用您的\uuuuuu setattr\uuuuu
调用\uuuu setattr\uuuu
时,self
将是Officer
实例,rank
将是所设置属性的名称,value
将是该属性所需的值
您所做的是使军官
类可以为列表中的值设置中尉
等,而不是.rank
(或.name
或.gender
),并且您实际上根本没有限制该属性的值
这是比你想要的更深刻的魔法;显然,您想限制设置
.rank
属性时使用的值。为此,请使用一个属性。在任何时候以任何方式设置官员的任何属性时,包括在通过超类\uuuu init\uu
初始化期间,都会调用的\uuuu setattr\uuu
调用\uuuu setattr\uuuu
时,self
将是Officer
实例,rank
将是所设置属性的名称,value
将是该属性所需的值
您所做的是使军官
类可以为列表中的值设置中尉
等,而不是.rank
(或.name
或.gender
),并且您实际上根本没有限制该属性的值
这是比你想要的更深刻的魔法;显然,您想限制设置.rank
属性时使用的值。为此,请使用属性。为什么要重写\uuuuu setattr\uuuuu
?也许更好的办法是在Solider
或officer
类中的\uuuuuu init\uuuuuuuuu
方法中添加一些逻辑。与其使用setattr
检查参数有效性,不如使用属性设置器。为什么要重写\uuuuu setattr\uuuuuu
?也许更好的办法是在Solider
或officer
类中的\uuuu init\uuuuu
方法中添加一些逻辑。与其使用setattr
检查参数有效性,不如使用属性设置器。