2009-03-30 5 views
1

Donc, si j'ai une classe comme:Est-il possible de créer une classe qui représente un autre type en Python, lorsqu'elle est référencée directement?

CustomVal 

Je veux être en mesure de représenter une valeur littérale, donc comme la mise dans le constructeur:

val = CustomVal (5) 

val.SomeDefaultIntMethod 

Fondamentalement, je veux le CustomVal pour représenter tout ce qui est spécifié dans le constructeur.

Je ne parle pas de méthodes personnalisées qui savent comment gérer CustomVal, mais plutôt d'en faire une autre valeur dont j'ai besoin.

Est-ce possible? Btw 5 est juste un exemple, en réalité, c'est un type COM personnalisé que je veux facilement citer. Donc en référençant CustomVal, j'aurai accès à la fonctionnalité int (pour 5), ou à la fonctionnalité de l'objet que je veux représenter (pour COM).

Donc, si l'objet COM est RasterizedImage, alors je vais avoir accès à ses méthodes directement:

CustomVal.Raster() ... 

EDIT: Voici ce que je veux dire: Je ne veux pas accéder comme un attribut, mais le lui-même l'objet:

CustomVal 

au lieu de:

CustomVal.SomeAttribute 

la raison pour laquelle je veux que c'est parce que, la L'objet COM est trop impliqué pour être initialisé et, de cette façon, il ressemblera à l'implémentation interne d'origine de l'application.

Répondre

7

La manière habituelle pour envelopper un objet en Python est de passer outre __getattr__ dans votre classe:

class CustomVal(object): 
    def __init__(self, value): 
     self.value = value 

    def __getattr__(self, attr): 
     return getattr(self.value, attr) 

Alors vous pouvez faire

>>> obj = CustomVal(wrapped_obj) 
>>> obj.SomeAttributeOfWrappedObj 

Vous pouvez également remplacer __setattr__ et __delattr__ pour activer le réglage et supprimer des attributs, respectivement (voir the Python library documentation).

2

Vous venez peut-être Overthinking ce ... Vous pouvez mettre tout ce que vous voulez dans votre val, puis appelez quelle que soit la méthode de l'objet que vous souhaitez:

>>> val = ThingaMoBob(123, {p:3.14}, flag=False) 
>>> val.SomeCrazyMathod() 

Est-ce que je manque quelque chose?

+0

Je pense qu'il veut que le nouvel objet implémente exactement la même interface de l'objet qu'il passe à son constructeur. Une sorte de modèle de décorateur de style GoF ... –

+0

S'il implémente la même interface, alors - eh bien - n'est-ce pas juste l'objet original? Pourquoi l'emballer? Il suffit de l'utiliser. –

+0

@ S.Lott Ce n'est pas nécessairement l'objet original. De wikipedia: Dans la programmation orientée objet, le motif décorateur est un motif de conception qui permet d'ajouter dynamiquement un nouveau comportement à une classe existante. vérifier: http://en.wikipedia.org/wiki/Decorator_pattern – Martin

Questions connexes