8

これを理解するのを手伝ってください。クラスを理解するための非常に単純なプログラムを作成しました。

class One(object):
    def __init__(self, class2):
        self.name = 'Amy'
        self.age = 21
        self.class2 = class2

    def greeting(self):
        self.name = raw_input("What is your name?: ")
        print 'hi %s' % self.name

    def birthday(self):
        self.age = int(raw_input("What is your age?: "))
        print self.age 

    def buy(self):
        print 'You buy ', self.class2.name

class Two(object):
    def __init__(self): 
        self.name = 'Polly'
        self.gender = 'female'

    def name(self):
        self.gender = raw_input("Is she male or female? ")
        if self.gender == 'male'.lower():
            self.gender = 'male'
        else:
            self.gender = 'female'

        self.name = raw_input("What do you want to name her? ")

        print "Her gender is %s and her name is %s" % (self.gender, self.name)

Polly = Two()
Amy = One(Polly) 
# I want it to print 


Amy.greeting()
Amy.buy() 
Amy.birthday()

問題コード

Polly.name() # TypeError: 'str' object is not callable
Two.name(Polly)# Works. Why?

クラス インスタンス Polly でメソッドを呼び出しても機能しないのはなぜですか? 私はかなり迷っています。http://mail.python.org/pipermail/tutor/2003-May/022128.htmlとこれに似た他の Stackoverflow の質問を見てきましたが、わかりません。どうもありがとう。

4

4 に答える 4

4

クラスTwoにはインスタンスメソッドがありますname()。したがってTwo.name、このメソッドを参照すると、次のコードが正常に機能します。

Polly = Two()
Two.name(Polly)

ただし、__init__()では、文字列に設定してオーバーライドnameするため、の新しいインスタンスを作成するたびTwoに、name属性は関数ではなく文字列を参照します。これが、以下が失敗する理由です。

Polly = Two()      # Polly.name is now the string 'Polly'
Polly.name()       # this is equivalent to 'Polly'()

メソッドとインスタンス変数に別々の変数名を使用していることを確認してください。

于 2012-05-18T17:25:57.467 に答える
3

nameというメソッドで属性を上書きしていますname。何か名前を変更するだけです。

于 2012-05-18T17:19:59.813 に答える
1

慎重に名前を付ける習慣を身につけることを強くお勧めします。ご覧のとおり、非常に小さなコードでも、問題が発生する可能性があります。PythonスタイルのPEPを注意深く読みたいと思うでしょう。http://www.python.org/dev/peps/pep-0008/

于 2012-05-18T17:27:15.317 に答える
1

Two には「name」という名前の変数関数の両方があります。それらの1つに別の名前を付ければ、機能するはずです。

于 2012-05-18T17:20:40.403 に答える