【问题标题】:Python Dynamic SubclassingPython 动态子类化
【发布时间】:2013-10-26 15:55:15
【问题描述】:

可能的重复: Is there a way to create subclasses on-the-fly? Dynamically creating classes - Python

我想创建一个子类,其中唯一的区别是一些类变量,但我希望其他一切都保持不变。我需要动态地执行此操作,因为我只知道运行时的类变量值。

这是到目前为止的一些示例代码。我希望 FooBase.foo_var 为“默认”,但 FooBar.foo_var 为“bar”。迄今为止没有任何尝试成功。

class FooBase(object):
    foo_var = "default"

    def __init__(self, name="anon"):
        self.name = name

    def speak(self):
        print self.name, "reporting for duty"
        print "my foovar is '" +  FooBase.foo_var + "'"


if __name__ == "__main__":
    #FooBase.foo_var = "foo"
    f = FooBase()
    f.speak()

    foobarname = "bar"
    #FooBar = type("FooBar", (FooBase,), {'foo_var': "bar"})
    class FooBar(FooBase): pass
    FooBar.foo_var = "bar"
    fb = FooBar()
    fb.speak()

非常感谢

EDIT 所以我显然对这一行有问题:

print "my foovar is '" + FooBase.foo_var + "'"

接受的答案在代码中有self.foo_var。这就是我应该做的。我现在觉得很可笑。

【问题讨论】:

    标签: python-2.7 dynamic subclassing


    【解决方案1】:

    这个呢:

    def make_class(value):
      class Foo(object):
        foo_var = value
    
        def speak(self):
          print self.foo_var
      return Foo
    
    FooBar = make_class("bar")
    FooQux = make_class("qux")
    
    FooBar().speak()
    FooQux().speak()
    

    也就是说,你不能让 foo_var 的值成为你的类的实例变量吗?因此,使用不同输入实例化的同一个类以不同的方式表现,而不是为每个不同的行为创建不同的类。

    【讨论】:

    • 谢谢,我错过了self.foo_var。我更喜欢使用类变量而不是实例变量的原因是我将拥有无数个实例,但可能有 1-3 个子类。
    • 仅基于该动机,我认为您应该将 foo_var 设为实例变量。在没有实例变量的情况下,创建您的实例将同样快。听起来您正在尝试优化某些东西而不需要。
    • 是的,你是对的。我有压力尽可能地优化它。我将尝试使用/不使用类变量,看看是否有任何区别(可能没有)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多