0

ここに私が持っているコードがあります

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ですか?

4

2 に答える 2

5

あなたが投稿していないのは、あなたによって作成された 2 つのメッセージです__setattr__

Invalid officer rank
Invalid officer rank

これらは次の行から取得されます。

self.name = name
self.gender = gender

これらは失敗するため、後で名前を取得することはできません。

 print 'Hi there, I am '+ self.name

修理:

def __setattr__(self, key, value):
    if key == "rank" and value not in [.....]
于 2012-08-25T22:30:16.737 に答える
0

Yourは、スーパークラスを介した初期化中を含め、いつでも何らかの方法で__setattr__の属性が設定されたときに呼び出されます。Officer__init__

__setattr__呼び出されると、selfOfficerインスタンスにrankなり、 が設定される属性の名前valueなり、がその属性に必要な値になります。

あなたが行ったことは、リスト内の値に etc. を含めることができるが、(orまたは) を持たないようにOfficerクラスを作成することです。実際には、その属性の値をまったく制限していません。.lieutenant.rank.name.gender

これはあなたが探していたよりも深い魔法です。属性を具体的に設定するときに使用されるを明らかに制限したかったのです。これを行うには、プロパティを使用します。.rank

于 2012-08-26T03:34:21.653 に答える