2015-08-23 3 views
0
поддержки существующих

Нового Питону здесь, и я ищу, чтобы прикрепить некоторый класс, ClassA.methodA к другому ClassB нижеПрикрепление метода класса к другому классу

def methodA(self, x=None, y=None, z='somevalue', l=None, m=False, **kwds): 

    ... Some logic here.... 

    a = self.getMyInstanceOfClassA() //a is of type ClassA, not ClassB 
    a.methodA(x,y,z,l,m,**kwds) 

ClassB.methodA = methodA 

... 

h = ClassB() 
h.methodA("p1", "p2", m=True) 

Цель состоит в том, чтобы сохранить подпись ClassB.methodA так же, как предполагается, что он находится на фактическом ClassA.methodA, который доступен по методу ClassB.getMyInstanceOfClassA().

Причина Я делаю это, чтобы избежать моего пользователя, чтобы написать этот код

h = ClassB() 
---the extra logic--- 
a = h.getMyInstanceOfClassA() 
a.methodA(....) 

вместо этого просто сказать

h = ClassB() 
h.methodA(....) 

и встроить дополнительную логику внутри нового Methoda на ClassB.

Methoda что-то значимое в нашей области, и я должен держать свое имя и точной подпись

я должен импортировать как CLASSA и ClassB от нашей внутренней LIBS и я не могу сделать ClassB наследовать от ClassA.

Дело в том, что метод A обычно не вызывается со всеми его аргументами, а переданные аргументы зависят от того, что вы хотите для методаA. Это h.methodA("p1", "p2", m=True) не удается с некоторой ошибкой, жалуясь на то, что передал слишком много аргументов.

Я правильно обертываю методА?

+0

Можете ли вы привести полный пример того, что вы используете (небольшой комплект, который работает на нашей машине) и полный трассировка? –

+0

А что делает - 'a = self.embededClass()' give? Когда вы выполняете 'MyClass.methodA = methodA', вы переопределяете эту новую функцию на уровне класса, а не только для своих экземпляров, поэтому, если бы была предыдущая функция, если вы ее не сохранили, вы не сможете получить ее обратно , –

+0

Код компании настолько сложнее поделиться, но я обновляю вопрос с дополнительной информацией. Надеюсь, теперь это станет яснее. – iCode

ответ

0

Я думаю, что вы обычно просто используете наследование или просто делаете этот метод функцией, не связанной с классом, с одним из входов, являющимся экземпляром этого класса. Или вы просто заверните его в функцию лямбда.

Python: Bind an Unbound Method?

Однако, если вы хотите взять метод и привязать его к экземпляру класса использования что-то вроде кода ниже.

inst = MyClass() 
inst.methodA = methodA.__get__(inst, MyClass) 
+0

Нет, я хочу это во всех экземплярах MyClass. Наследование не является вариантом, потому что я не могу контролировать существование embededClass(). Думайте об этом, так как у меня есть доступ к коду MyClass. – iCode

0

Я не уверен, что является причиной вашей ошибки (Мы не можем быть уверены, что если вы по крайней мере не показывать полный отслеживающий или по крайней мере демо-код, который воспроизводит проблему).

Но из кода, который вы вставили, то, что вы пытаетесь сделать, было бы невозможно. Давайте рассмотрим простой пример -

>>> class A: 
...  def methodA(self, a): 
...    print(a) 
...    print("In A") 
... 
>>> def methodA(self, a, b=None): 
...  print("In Main") 
...  if b == None: 
...    return 
...  else: 
...    h = type(self) 
...    h.methodA(self, a) 
... 
>>> A.methodA = methodA 
>>> h = A() 
>>> h.methodA(1,2) 
In Main 
In Main 

Я просто поставил b == None часть, так что код не делает inifinite рекурсию, но то, что вы пытаетесь приведет к бесконечной рекурсии. Зачем?

Поскольку вы изменили methodA, чтобы указать на новый метод на уровне класса, так что даже если вы звоните methodA для класса, он бы до сих пор называют недавно связанной methodA, а не старый.

Если вы действительно не хотите, чтобы пользователи позвонить старый methodA непосредственно, одна вещь, которую вы можете сделать, это связать этот метод с другим именем, может быть _methodA, а затем связать свою новую функцию methodA.Пример:

>>> class A: 
...  def _methodA(self, a): 
...    print(a) 
...    print("In A") 
... 
>>> def methodA(self, a, b=None): 
...  print("In Main") 
...  if b == None: 
...    return 
...  else: 
...    h = type(self) 
...    h._methodA(self, a) 
... 
>>> A.methodA = methodA 
>>> h = A() 
>>> h.methodA(1,2) 
In Main 
1 
In A 
+0

Так что извините за путаницу. methodA находится на другом классе, а не ClassA. Я скоро остановлюсь. Еще раз извините. – iCode

+0

Как я уже сказал, пока вы не дадите точную демонстрацию, которая воспроизводит вашу проблему вместе с полной трассой, мы не сможем вам помочь. –

+0

Несомненно, я обновил вопрос и, надеюсь, стал более ясным. Я полностью понимаю, но я не могу опубликовать настоящие ClassA и ClassB. Я попытаюсь воспроизвести это с помощью общедоступного кода. Не могли бы вы хотя бы проверить, имеет ли смысл прохождение пара? – iCode

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