2017-03-12 22 views
1

私のクラス属性にの名前を使用しようとしていますが、それは不可能です。 ここのコードです:インスタンス属性を使用してクラス属性を定義する方法は?

class B: 

    def __init__(self, val): 
     self.val = val 

    def __get__(self, instance, owner): 
     return owner.valEditNew(self.val) 

    def __set__(self, instance, value): 
     return 


class A: 

    def __init__(self, name = 'def_name'): 
     self.name = name 

    attr = B('G120') 

    def valEditNew(val): 
     val += ' @edited' 
     return val 

a = A('JJ') 
print(a.attr) 

それができない場合、私はG120 >>> builtins.NameError: name 'self' is not defined の代わりにself.name名前または...を使用している場合、それだと、あなたは私の道を示すことができますが?

答えて

1

あなたは__get__/__set__instanceパラメータを使用、記述子オブジェクトが含まれているインスタンスの属性にアクセスする場合:私は、私はここに__get__と__set__メソッドをオーバーライドしてることを知っている

class B: 

    def __get__(self, instance, owner): 
     return instance.valEditNew(instance.name) # <--- 

    def __set__(self, instance, value): 
     return 


class A: 

    attr = B() 

    def __init__(self, name='def_name'): 
     self.name = name 

    def valEditNew(self, val): 
     val += ' @edited' 
     return val 


a = A('JJ') 
print(a.attr) 
# prints => JJ @edited 
+0

を...どこすることができます私は元のものを見つける? –

+0

@ shiyonsufa、https://docs.python.org/3/howto/descriptor.htmlまたはhttps://docs.python.org/3/reference/datamodel.html#descriptors – falsetru

+0

@shiyonsufaを読むことをお勧めします。 Bはどんなクラスのサブクラスでもないが、 '__get__'、' __set__'を持たない 'object';オーバーライドは行われません。対話的なシェルで 'object .__ get__'を試してみてください。 – falsetru

関連する問題