首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__setattr__破坏代码?

__setattr__破坏代码?
EN

Stack Overflow用户
提问于 2012-08-26 06:22:24
回答 2查看 242关注 0票数 0

下面是我拥有的代码

代码语言:javascript
复制
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)

每当我尝试创建一个军官时,它就会中断:

代码语言:javascript
复制
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时输入的名称

EN

回答 2

Stack Overflow用户

发布于 2012-08-26 06:30:17

您尚未发布的是您的__setattr__创建的两条消息

代码语言:javascript
复制
Invalid officer rank
Invalid officer rank

这些代码来自以下几行:

代码语言:javascript
复制
self.name = name
self.gender = gender

由于这些操作都失败了,因此您以后无法检索该名称:

代码语言:javascript
复制
 print 'Hi there, I am '+ self.name

修复:

代码语言:javascript
复制
def __setattr__(self, key, value):
    if key == "rank" and value not in [.....]
票数 5
EN

Stack Overflow用户

发布于 2012-08-26 11:34:22

在任何时候以任何方式设置Officer的任何属性时,都会调用您的__setattr__,包括通过超类__init__进行初始化期间。

调用__setattr__时,self将是Officer实例,rank将是设置为的属性的名称,value将是该属性所需的值。

您所做的是使Officer类可以对列表中的值有.lieutenant等,但不能有.rank (或.name.gender) -而且您实际上根本没有限制该属性的值。

这比您所寻找的更有魔力;您显然希望限制在设置属性时使用的值,特别是。要执行此操作,请使用属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12126111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档