2013-04-29 5 views
1

파이썬에는 작업 클래스와 관련된 설정 사전이 있습니다. 이러한 작업의 부모 생성자에서 관련 설정 만 저장하려고하지만이 작업을 수행하려면 부모 클래스에서 하위 클래스에 액세스해야합니다. 생성자에서 get_class($this);를 호출하여부모 클래스의 하위 클래스 인스턴스에 액세스

PHP에서
settings = { 
    SomeTask: { 'foo': 'bar' }, 
    SomeOtherTask: { 'bar': 'foo' }, 
} 

class SomeTask(BaseTask): 
    pass 

class SomeOtherTask(BaseTask): 
    pass 

class BaseTask: 
    def __init__(self, settings): 
     self.settings = settings[child_class] 

나는이 작업을 수행 할 수 있습니다 파이썬이 비슷한 있는가, (자식 클래스 이름이 아닌 부모를 반환)? 당신은 설정 하위 클래스 중 하나를 초기화 할 때, 그들은 당신이 무엇을 기대 할 것

class BaseTask: 
    def __init__(self, settings): 
     self.settings = settings[self.__class__] 

class SomeTask(BaseTask): 
    pass 

class SomeOtherTask(BaseTask): 
    pass 

:

+0

정의가 정확하게 잘못된 순서로 있음을 알고 있습니까? – delnan

+0

그래, 이걸 의도적으로 묘사 했어. (나에게) 이런 식으로 설명하는 것이 더 의미가있다. – Ross

+0

자기 (또는 실제로 클래스 메소드의 첫 번째 인수)는 항상 작업중인 instanstiated 클래스를 참조합니다. –

답변

3

그냥 이렇게.

+0

순환 참조를 만들지 않고도이 작업을 수행 할 수 있습니까? – Aya

+0

@Aya 순환 참조가 없습니다 (문제가 없더라도 문제가되지 않습니다). – delnan

+0

다른 방법으로는, PHP 버전과 더 관용적 인'type (self)'입니다. 또한 이전 스타일의 클래스를 사용하므로 새로운 스타일의 클래스를 사용해야합니다. – delnan

1

PHP 코드에 가장 가까운 파이썬 해당하는 ...

$class_name = get_class($my_object) 

은 ... 이전 스타일과 새로운 - 모두 작동합니다

class_name = my_object.__class__.__name__ 

입니다 ... 스타일 파이썬 클래스.

실제로 클래스 개체에 대한 참조를 사용하지 않고 이름으로 클래스의 인덱스를 작성하면 settings 매개 변수를 전달할 필요가 없습니다 (순환 참조를 피하는 것으로 만 가정 함) 그리고 나는 그것이

class SomeTask(BaseTask): 
    settings = { 'foo': 'bar' } 

class SomeOtherTask(BaseTask): 
    settings = { 'bar': 'foo' } 

가 변경이 설정은 변경되지 않습니다 제공 할 많은 청소기이라고 생각 ...

settings = { 
    'SomeTask': { 'foo': 'bar' }, 
    'SomeOtherTask': { 'bar': 'foo' }, 
} 

class BaseTask: 
    def __init__(self): 
     self.settings = settings[self.__class__.__name__] 

class SomeTask(BaseTask): 
    pass 

class SomeOtherTask(BaseTask): 
    pass 
+1

일반적으로 클래스 이름으로가는 것은 꽤 허약합니다. 심지어 내 모듈 이름 + 모듈의 정규화 된 이름을가는 것은 꽤 해킹입니다. – delnan

0

을 직접 글로벌 settings 변수에 액세스 할 수 있습니다.

이렇게하면 변경 내용이 클래스에 밀접하게 결합되며 이러한 설정이 포함 된 dict 개체가 하나만 있습니다.

+0

실제로는 좀 더 복잡합니다. settings = { 'client1': {SomeTask : {}}, 'client2': {OtherTask : {}}}'와 비슷합니다. 그러나 그 경우에 동의합니다 :) – Ross

+0

@ 로스 나는이 사건이 또한 커버 될 수 있다고 생각합니다 ... – glglgl

관련 문제