2012-04-05 3 views
4

Я хотел бы знать, как преобразовать родительский объект, который был возвращен некоторой функцией дочернему классу.Как преобразовать (наследовать) родительский в дочерний класс?

class A(object): 
    def __init__(): 
     pass 

class B(A): 
    def functionIneed(): 
     pass 

i = module.getObject()# i will get object that is class A 
j = B(i)# this will return exception 
j.functionIneed() 

Я не могу изменить класс А. Если бы я мог, я бы реализовать functionIneed к классу А, но это невозможно из-за структуры кода. Thanks

ответ

12

Python не поддерживает «литье». Вам нужно будет написать B.__init__(), чтобы он мог взять A и инициализировать его соответствующим образом.

+1

Это лучший ответ, чем мой. –

3

У меня есть сильное подозрение, нет, убеждение, что в вашем программном дизайне есть что-то ужасное, что оно требует от вас этого. В Python, в отличие от Java, очень мало проблем требуют, чтобы классы решались. Если есть функция, которую нужно просто определить его:

def function_i_need(a): 
    """parameter a: an instance of A""" 
    pass # do something with 'a' 

Однако, если я не могу отговорить вас от вашей функции это метод класса, вы можете изменить класс данных экземпляра, установив его __class__ атрибут:

>>> class A(object): 
...  def __init__(self): 
...   pass 
... 
>>> class B(A): 
...  def functionIneed(self): 
...   print 'functionIneed' 
... 
>>> a = A() 
>>> a.functionIneed() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'A' object has no attribute 'functionIneed' 
>>> a.__class__ = B 
>>> a.functionIneed() 
functionIneed 

Это будет работать до тех пор, пока у B нет метода __init__, так как, очевидно, что __init__ никогда не будет называться.

+1

Я просто писал об альтернативном решении, которое может быть лучше или может быть намного хуже. Messing с '__class__' является странным и, возможно, опасным, но, похоже, работает (по крайней мере, в CPython) - см. [A Python« Cast Constructor »] (http://late.am/post/2012/04/05/ a-python-cast-constructor) – dcrosta

+1

@dcrosta Не могли бы вы превратить этот пост в ответ? Вы знаете, linkrot и т. Д. –

2

Вы сказали, что вы хотите сделать что-то вроде этого:

class B(A): 
    def functionIneed(): 
     pass 

Но на самом деле то, что вы будете делать что-то больше, как это (если вы не намеревались на создание способа class или static в первую очередь) :

class B(A): 
    def functionIneed(self): 
     pass 

Тогда вы можете позвонить по телефону B.functionIneed(instance_of_A). (Это одна из преимуществ того, чтобы pass self explicitly to methods.)

0

Как насчет:

i = module.getObject() # i will get object that is class A 
try: 
    i.functionIneed() 
except AttributeError: 
    # handle case when u have a bad object 

Читайте на утиной типизации.

Смежные вопросы