2014-04-21 3 views
1

변형 된 이름을 메타 클래스로 초기화 할 수 있습니까?파이썬에서 변경된 이름을 메타 클래스로 초기화 할 수 있습니까?

class MetaA(type): 
    def __new__(metaCls, name, bases, clsDict): 
    clsDict['_%s__counter' % name] = 0 
    return super(MetaA, metaCls).__new__(metaCls, name, bases, clsDict) 

class A(object): 
    __metaclass__ = MetaA 

검색된 결과가 명확하지 않습니다. 나는 종종 맹 글링 된 이름을 사용하지만, 드물게 메타 클래스를 사용하고 유효하지 않은 경우 해당 코드가 확실하지 않은 경우 '_%s__%s' % (className, attrName) - 작동하지만 어쩌면 호환되지 않을 수 있습니다.

+0

@Blckknght metaclass는 클래스 용 팩터 리와 비슷하므로 메타 클래스를 사용하고 코드 또는 제어 코드 미러링을 반복하지 않고 많은 클래스를 만들 수 있으므로 오류를 방지하는 데 좋은 패턴이지만 자주 필요하지는 않습니다. OOD를 사용하여 클래스별로 별도의 초기화 클래스 변수를 공유하지 못하게 할 수는 없습니다. 상속을 통해 불가능하거나 일부 공유 변수를 다시 초기화하여 공유하지 않도록 할 수 있습니다 (예 : 교착 상태 방지를위한 스레딩 잠금).). – Chameleon

답변

0

당신이해야 할 일은 합법적이고 다소 안전합니다 (개인의 이름을 암시하는 속성에 액세스하는 것처럼 안전합니다). 그래도 디자인 관점에서는 좋은 생각이 아닐 수도 있습니다.

질문은 왜 처음에 맹 글링 된 이름을 사용하고 있습니까? 속성이 여러 클래스 (클래스 및 해당 메타 클래스를 통한 액세스 포함)에서 액세스하려는 경우, 아마 변형되지 않은 속성 이름을 사용해야합니다.

속성의 맹 글링을 해결해야 할 필요가있는 경우 종종 맹 글링 된 이름을 과도하게 사용하게됩니다. 하나의 선행 밑줄을 사용하여 이름이 "개인"(또는 적어도 클래스의 안정된 공용 API에 포함되지 않음)임을 제안하십시오.

일반적으로 속성 이름 공간을 어떤 이유로 든 "깨끗하게"유지해야하기 때문에 일반적으로 몇 개의 클래스 만 변형 된 이름을 필요로합니다. 예를 들어, 프록시 클래스는 속성 네임 스페이스가 마치 대상 objcecte의 복제본처럼 작동하도록 할 수 있습니다. 변경된 이름을 사용하면 프록시의 인스턴스 변수가 대상의 속성을 섀도 잉하지 못하도록 방지 할 수 있습니다.

+0

맹 글링 된 이름은 _names보다 자주 사용되기 때문에 코드를 강제로 제거하므로 전혀 사용할 수 없습니다. 메타 클래스는 상속 된 클래스와 같지 않습니다. 클래스와의 거리가 다르기 때문에 사용법이 다르기 때문에 비교할 수 없습니다. 동일하다고 말하는 것은 너무 많은 차이입니다. 스레드 잠금을 사용하는 단순한 예제 맹 글링 변수를 고려하십시오. 눈에 잘 띄어 야합니까? 메타 클래스에서 볼 수 있어야합니다 - 예? 클래스에 의해 초기화 될 수 있습니다 - 아니요? 객체 인스턴스로 초기화 할 수 있습니다 - 아니요/예하지만 메모리 낭비가 있습니까? 메타 클래스로 초기화 할 수 있습니까? – Chameleon

+0

BTW 내 코드 스타일을 향상시킬 수 있지만 매우 복잡한 프로그램, 즉 수많은 버그없이 500k 줄의 코드를 작성하는 것으로 충분합니다. – Chameleon

+0

메타 크라스에 일부 동작의 전체 구현을 넣는 경우, 맹 글링 된 이름을 사용하면 해당 메타 클래스가 자체 이름 * (즉, 메타 클래스 코드에서 __attr 만 사용)에서 맹 글링을 수행하게하는 것이 의미가 있습니다. 그렇지 않으면 나는 여전히 메타 클래스에서 mangling을 수동으로 수행하는 것이 아니라 일반 이름을 사용하는 것이 더 나을 것이라고 생각한다. 그러나 좋은 디자인은 대체로 의견의 문제입니다. 내 대답의 첫 번째 단락에서 말했듯이, 원한다면 맹 글링을 취소하는 것이 합법적입니다. 맹 글링을 사용하는 동안 가치가 있다고 생각된다면, 프로젝트에서 효과를 발휘할 수있을 것입니다. – Blckknght

관련 문제