2010-07-22 3 views
0

Je veux faire ce qui suit: J'ai un Container-classe Container, il a attribut attr, qui se réfère à une autre classe OtherClass.L'accès Python à l'objet en tant que fonction (pas __call__)

class OtherClass: 
    def __init__(self, value): 
     self._value = value 

    def default(self): 
     retirn self._value 

    def another(self): 
     return self._value ** 2 

    def as_str(self): 
     return 'String: %s' % self._value 

class Container: 
    def __init__(self, attr): 
     self.attr = OtherClass(attr)

Je veux:

x = Container(2) 

x.attr # when accessing the attribute - return value from default method 
2 
x.attr.another() # but also an attribute can be treated as an object 
4 
x.attr.as_str() 
'String: 2' 

Comment puis-je faire cela?

+0

Je ne peux pas croire que je perdu 20 minutes sur ce . Assurez-vous juste que 'attr' est une classe qui a une méthode appelable' autre'. Cela ne peut pas être fait avec les propriétés, les proxies ou la métaclasse. –

Répondre

0

Vous ne pouvez pas, à moins que OtherClass remplace __int__() et vous le passez ensuite par int() pour obtenir la valeur entière.

0

Qu'est-ce que attr? Vous ne pouvez pas l'avoir dans les deux sens; soit c'est la valeur de retour de certaines fonctions ou c'est une instance de OtherClass. Comment faire pour OtherClass hériter de Integer?

+0

Les valeurs renvoyées peuvent être de différents types. –

+0

Dans ce cas pourquoi ne pouvez-vous appeler 'x.attr.default()' quand vous voulez sa valeur? – katrielalex

+0

Je veux donner aux développeurs une API simple. Si aucune méthode spécifique - renvoie la valeur par défaut. Dans tous les cas, merci pour votre aide. –

2

Vous ne savez pas si c'est ce dont vous avez besoin. On dirait un design étrange pour moi

>>> class OtherClass(int): 
...  def __init__(self, value): 
...   self._value = value 
...  def another(self): 
...   return self._value ** 2 
... 
>>> class Container: 
...  def __init__(self, attr): 
...   self.attr = OtherClass(attr) 
... 
>>> x=Container(2) 
>>> x.attr 
2 
>>> x.attr.another() 
4 

juste parce-you-use-classes-moyennes-doesnt-OO-une manière ly gnibbler

+0

Cela semble la seule solution plausible, même si cela est tout simplement désagréable. – Bakuriu

Questions connexes