0

以下のトピックは、以下の問題の代わりにチェックされています。

Python で、自分のクラスのインスタンスが存在するかどうかを確認するにはどうすればよいですか?

クラスの Python チェック インスタンス

私はPythonの完全な初心者であるため、ご容赦ください。クラスに取り組み始めたばかりで、単純な家族の財務エミュレーターが良い出発点になると判断しました。以下は私のコードです:

class Family(object):

def __init__(self,name,role,pay,allowance):
    self.name = name
    self.role = role
    self.pay = pay
    self.allowance = allowance

def describe(self):
    print self.name + " is the " + self.role + " of the family. He brings home " + str(self.pay) + " in wages and has a personal allowance of " + str(self.allowance) + "."


class Parent(Family):

def gotRaise(self,percent):
    self.pay = self.pay * int(1 + percent)
    print self.name + " received a pay increase of " + str((100*percent)) + ("%. His new salary is ") + str(self.pay) + "."

def giveAllowance(self,val,target):
    if hasattr(target, Family):
        self.pay = self.pay - int(val)
        target.pay = target.pay + int(val)
        print self.name + " gave " + target.name + " an allowance of " + str(val) + "." + target.name + "'s new allowance is " + str(target.allowance) + "."
    else: print ""

class Child(Family):

def stealAllowance(self,val,target):
    self.allowance = self.allowance + int(val)
    target.allowance = target.allowance - int(val)

def spendAllowance(self,val):
    self.allowance = self.allowance - int(val)


monty = Parent("Monty","Dad",28000,2000)
monty.describe() # 'Monty is the Dad of the family. He brings home 28000 in wages and has a personal allowance of 2000.'
monty.giveAllowance(1000,jane) # Produces a "NameError: name 'jane' is not defined" error.

問題のポイントは、giveAllowance() 関数です。Family のターゲット インスタンスが存在するかどうかを確認し、存在する場合は値の転送を返し、存在しない場合は通常の文字列を返す方法を見つけようとしています。ただし、hasattr()、try - NameError を除き、isinstance()、および vars()[target] でさえ、上記の NameError に対処できません。

ここで、クラスに関して行うべき何かが欠けていますか。別のクラス内からのインスタンスをチェックするときの例外、間違った構文など? 上記のリンクのいずれかから、それが唯一の方法であるように思われるので、可能であれば、辞書が最後の手段でない限り、辞書には近づかないようにしたいと思います。

ありがとう!

4

2 に答える 2

1

関数が呼び出される前に NameError が発生しますgiveAllowance。のようなものを書く場合giveAllowance(10, jane)、変数janeは他のすべての前提条件として存在する必要があります。存在しない変数では何もできません。「暫定的に」使用して、後で存在するかどうかを確認することはできません。

なぜこれができるようになりたいのですか?この状況でエラーを発生させることは、起こるべきことのようです。デザインを考え直すことをお勧めします。インスタンスが存在するかどうかを確認するという点で目的を達成できると仮定してもgiveAllowance、存在しない人に許可を与えようとしたときに空の文字列を返すだけの関数を使用しても意味がありません。各家族の名前のキー (文字列) を使用して、家族を表す辞書を用意する方が理にかなっている場合があります。if person in familyDict次に、その人物が存在するかどうかを確認するために使用できます。

ちなみに、これは家族を表すのではなく、家族のメンバーFamilyを表すため、クラスの名前としてはおそらく適切ではありません。

于 2013-10-01T03:37:45.900 に答える
0

Throw away the classes and you wrote:

x = 28
print x    # prints 28
print y    # throws a name error, complete lack of surprise

You never defined jane so the interpreter told you that.

You say:

I have been trying to find a way to check if the target instance of Family exists and to return a transfer of value if it does and a normal string if it doesn't.

You're getting way ahead of yourself, don't be so tricky to start. If you want jane to be instantiated, instantiate her.

于 2013-10-01T03:40:56.423 に答える