2014-04-16 2 views
0

내가 작업하고있는 특정 모듈의 wierdness 때문에 한 클래스가 메서드에서 로컬로 생성 된 다른 클래스의 속성을 상속하는 일반적인 방법이 있는지 궁금합니다. . 예를 들어, 뭔가 다음 파이썬에서함수에서 클래스를 동적으로 상속 받음

class MyClass(DefForm()): 
    ... 

클래스는 일반 객체와 당신 :

def DefForm(): 
    class F(object): 
     foo = bar 

    return F 

class MyClass(DefForm): 
    pass 

m = myClass() 
m.foo 
>>> 'bar' 

답변

4

반환 함수의 값하지 함수 자체에서 클래스를 상속 하나를 상속 받으면, 당신은 단지 객체로부터 상속받는 것입니다.

예를 들어,이 또한 작동합니다

class Foo(Bar if x == 3 else Baz): 
    ... 

는 사실, 나는이 작동하지 않을 상황을 생각할 수 없다. 이것도 완벽하게 유효합니다 :

try: 
    ... 
except (FooExc if x == 3 else BarExc): 
    ... 

그래서 클래스 개체는 파이썬 에서뿐만 아니라 모든 상황에서 개체로 취급됩니다.

더 일반적인 메모에서, 클래스를 생성하는 것을 메타 프로그래밍이라고합니다. 그것은 많은 언어들 (동적 인 것뿐만 아니라 컴파일 된 것과 정적으로 타입이있는 것 둘 다)에서 일반적으로 행해지 며, 일반적으로 온전하고 가독성이 유지되는 한, 이것을하는 코드에 대해서는 "이상한"것이 없습니다. 그것은 다른 함수들로부터 함수를 생성하고 반환하는 것 (Functional Programming에서 극단적으로 널리 퍼지거나), 또는 실제로 어떤 객체를 반환하는 것과 마찬가지로 정상입니다.

+1

문법은 하나 이상의 특정 클래스 이름 대신에 표현의 넓은 범위를 허용한다. 파이썬 2는'test' 표현식 (본질적으로 값'또는'함께'또는'if ... else' 표현식)이나 람다 정의 (실제로 어떻게 해석되는지는 모르겠습니다)를 허용합니다. 파이썬 3은 본질적으로 기본 클래스 목록을 함수에 대한 인수 목록으로 취급하므로 구문이 동일합니다. 예를 들어'x = (A, B); 클래스 C (* x) : pass'는'x '의 요소가 유효한 클래스 인 한 합법적입니다. – chepner

+0

파이썬 2는 AFAIK; Python 3에서 splatting 트릭을 인식하지 못했습니다. 그것을 추가해 주셔서 감사합니다. –

+0

다음은 [Python 2] (https://docs.python.org/2/reference/grammar.html) 및 [Python 3] (https://docs.python.org/3/reference/grammar) 링크입니다. .html) 문법. 각각의'classdef' 규칙을보십시오. – chepner

1

이 시도 :

def DefForm(): 
    class F(object): 
     foo = bar 

    return F 

FClass = DeftForm() 

class MyClass(FClass): 
    pass 

m = myClass() 
m.foo 
관련 문제