2010-05-06 63 views
2

我可以讓一個類繼承Python中的「in-program」類嗎?在python中以編程方式向類繼承繼承?

繼承人是我迄今爲止:

base = list(cls.__bases__) 
base.insert(0, ClassToAdd) 
base = tuple(base) 
cls = type(cls.__name__, base, dict(cls.__dict__)) 
+1

你想創建一個新的類定義,還是將父項添加到現有的類定義中,或者將父項添加到現有的實例? – Ipsquiggle 2010-05-06 20:10:15

回答

8

下面是一個例子,使用格雷格Hewgill的建議:

class Foo(object): 
    def beep(self): 
     print('Hi') 

class Bar(object): 
    x=1 

bar=Bar() 
# bar.beep() 
# AttributeError: 'Bar' object has no attribute 'beep' 

Bar=type('Bar',(Foo,object),Bar.__dict__.copy()) 
bar.__class__=Bar 
bar.beep() 
# Hi 
4

是的,type()內置的功能有三個參數的形式可以做到這一點:

基地,字典

返回一個新的類型對象。這本質上是class聲明的動態形式。 名稱字符串是類名稱,併成爲__name__屬性; 基數元組逐項列出基類併成爲__bases__屬性;和字典字典是包含類體的定義的命名空間,並且成爲__dict__屬性。

+0

thx,我該如何維護當前的結構? – Timmy 2010-05-06 19:58:56

+0

一個例子會很好。 – grokus 2010-05-06 20:08:50

1

另一種方法是不改變的類層次結構動態,但裝飾對象的實例與新的功能。這通常更清晰且更容易調試,因爲您只需更改代碼所在的對象,而無需對整個類層次結構進行橫切更改。

def extend_object(obj): 
    class ExtensionClass(obj.__class__): 
     def new_functionality(self): 
      print "here" 
    obj.__class__ = ExtensionClass 

b = Foo() 
extend_object(b) 
b.new_functionality() 
#prints "here"