2011-01-20 9 views
1

NewOneクラスから 'self.b'属性にアクセスしようとすると、「AttributeError: 'NewOne'オブジェクトに 'self.b'属性がありません」というエラーメッセージが表示されるのはなぜですか?私はそれが正しいことを意味します。Python OOP、アクセス属性

class NewOne(object): 
    def __init__(self): 
     self.b = 'Cat' # this is what i want to access 
    def child(self): 
     self.c = 'kitten' 
     return self.c 

class FatherClass(object): 
    def __init__(self, a): 
     self.a = a 
    def son(self): 
     self.i = 'I and my father' 
     return self.i 
    def father(self): 
     self.x = 'are one' 
     return self.x 
    def father_son(self): 
     u = NewOne() 
     k = getattr(u, 'self.b') #why does it tell me NewOne has no self.b attr 
     return self.a, k() 

getattrを使用してメソッドにアクセスできませんか?なぜそれはgetattrと呼ばれgetmethか何かではないのですか? おかげ

答えて

6

この置き換え:ちょうど行う

k = getattr(u, 'b') 

またはより良い:

k = u.b 
+1

+1:「さらに良い...」 –

+0

ありがとう、ありがとう、ありがとう!属性とメソッドの名前が同じ場合はどうなりますか? – kassold

+0

属性とメソッドに同じ名前を付けることはできません。より正確には、メソッド*は属性であり、呼び出すことができるものです。 –

2

Youeではなく

k = getattr(u, 'b') 

またはより良い

k = u.b 

を記述する必要があります。

属性の名前は、であり、self.bではありません。通常はobj.attrで属性にアクセスします。属性の名前が動的(つまり、コードを記述するときには分からないが実行時には計算される)の場合にのみ、getattr()フォームが必要です。

+0

「の名前場合のgetattr()フォームにのみ必要とされている。このことにより、

k = getattr(u, 'self.b') 

を属性は動的です "それは明るいです。ありがとうございました。 – kassold