相关疑难解决方法(0)

如何从基类动态创建派生类

例如,我有一个基类如下:

class BaseClass(object):
    def __init__(self, classtype):
        self._type = classtype
Run Code Online (Sandbox Code Playgroud)

从这个课程中我得到了其他几个类,例如

class TestClass(BaseClass):
    def __init__(self):
        super(TestClass, self).__init__('Test')

class SpecialClass(BaseClass):
    def __init__(self):
        super(TestClass, self).__init__('Special')
Run Code Online (Sandbox Code Playgroud)

是否有一种不错的pythonic方法可以通过函数调用动态创建这些类,该函数调用将新类放入当前范围,如:

foo(BaseClass, "My")
a = MyClass()
...
Run Code Online (Sandbox Code Playgroud)

因为我会需要这样的注释和问题:派生类都具有完全相同的内部结构,区别在于构造函数采用了许多以前未定义的参数.因此,举例来说,MyClass需要的关键字a,而类的构造函数TestClass需要bc.

inst1 = MyClass(a=4)
inst2 = MyClass(a=5)
inst3 = TestClass(b=False, c = "test")
Run Code Online (Sandbox Code Playgroud)

但是他们永远不应该使用类的类型作为输入参数

inst1 = BaseClass(classtype = "My", a=4)
Run Code Online (Sandbox Code Playgroud)

我得到了这个工作,但更喜欢另一种方式,即动态创建的类对象.

python inheritance class

83
推荐指数
2
解决办法
7万
查看次数

如何在运行时动态更改实例的基类?

本文有一个片段__bases__,通过向类继承的类的现有类集合添加一个类来动态更改某些Python代码的继承层次结构.好的,这很难读,代码可能更清晰:

class Friendly:
    def hello(self):
        print 'Hello'

class Person: pass

p = Person()
Person.__bases__ = (Friendly,)
p.hello()  # prints "Hello"
Run Code Online (Sandbox Code Playgroud)

也就是说,Person不从Friendly源级别继承,而是通过修改__bases__Person类的属性在运行时动态添加此继承关系.但是,如果您更改FriendlyPerson成为新的样式类(通过继承自object),则会收到以下错误:

TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Run Code Online (Sandbox Code Playgroud)

关于这一点的谷歌搜索似乎表明,在运行时更改继承层次结构时,新样式类和旧样式类之间存在一些不兼容性.具体来说:"新式类对象不支持赋予其基础属性".

我的问题是,是否有可能通过使用__mro__属性使上述Friendly/Person示例在Python 2.7+中使用新式类工作?

免责声明:我完全意识到这是一个模糊的代码.我完全意识到,在实际的生产代码中,这样的技巧往往难以理解,这纯粹是一个思想实验,并且可以让人们了解Python如何处理与多重继承相关的问题.

python inheritance dynamic

68
推荐指数
3
解决办法
3万
查看次数

标签 统计

inheritance ×2

python ×2

class ×1

dynamic ×1