2013-10-17 6 views
1

가능한 중복 : Is there a way to create subclasses on-the-fly? Dynamically creating classes - Python파이썬 동적 서브 클래스

나는 유일한 차이점은 일부 클래스 변수하는 서브 클래스를 생성하고 싶습니다,하지만 난 동일하게 유지하기 위해 다른 모든 것을하고 싶습니다. 내가 런타임에만 클래스 변수 값을 알고 있기 때문에이 작업을 동적으로 수행해야합니다.

여기까지는 몇 가지 예제 코드가 있습니다. FooBase.foo_var를 "기본값"으로 설정하고 FooBar.foo_var를 "바"로 설정합니다. 지금까지 성공한 시도는 없습니다.

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

허용 대답이있다 self.foo_var 코드에서 :

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() 

많은 감사

편집 그래서 난 분명이 라인에 문제가 있습니다. 그게 내가해야 할 일이다. 나는 지금 우스꽝 스럽다. 이것에 대해

답변

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의 값이 클래스의 인스턴스 변수가 될 수 없습니다? 따라서 서로 다른 입력에 대해 인스턴스화 된 동일한 클래스는 각각 다른 동작에 대해 다른 클래스를 만드는 대신 다른 방식으로 동작합니다.

+0

감사합니다. 'self.foo_var'가 누락되었습니다. 인스턴스 변수 대신 클래스 변수를 선호하는 이유는 인스턴스 수가 많지만 아마 1-3 하위 클래스가 있기 때문입니다. – liang

+0

그 동기에만 근거하여 foo_var을 인스턴스 변수로 만들어야한다고 생각합니다. 당신의 인스턴스를 생성하는 것은 인스턴스 변수없이 우리의 인스턴스만큼 빠릅니다. 당신도 필요없이 무언가를 최적화하려고하는 것 같습니다. –

+0

예, 당신 말이 맞아요. 가능한 한 많이 최적화해야한다는 압박감이 있습니다. 나는 클래스 변수와 함께/시도하지 않고 어떤 차이가 있는지 알아볼 것이다 (아마 그렇지 않을 것이다) – liang