Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python __setattr\uuuuuuuuuu正在破译代码?_Python_Setattr - Fatal编程技术网

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
检查参数有效性,不如使用属性设置器。