동적 클래스 변수를 만들려면 locals()
또는 __metaclass__
을 사용하는 두 가지 옵션이있는 것 같습니다. 나는 locals()
에 배정 팬이 아니지만 그것은 클래스 정의에서 작동하는 것 같고 그것보다 더 간결합니다 __metaclass__
대안입니다.동적 클래스 변수 - locals() vs __metaclass__
이렇게하면 locals()
을 사용할 수 있습니까? 두 가지 솔루션의 장점/단점은 무엇입니까?
meta_attrs = ["alpha", "beta", "gamma"]
class C(object):
pass
for attr in meta_attrs:
setattr(C, attr, attr.upper())
내가 다섯 번째 옵션 자신을 위해 갈 것이다 :
meta_attrs = ["alpha", "beta", "gamma"]
def decorate(klass):
for attr in meta_attrs:
setattr(klass, attr, attr.upper())
return klass
@decorate
class C(object):
pass
여기에 네 번째 옵션이있다 :
kindall에서 언급 한 바와 같이meta_attrs = ["alpha", "beta", "gamma"]
class C(object):
local_context = locals()
for attr in meta_attrs:
local_context[attr] = attr.upper()
class D(object):
class __metaclass__(type):
def __new__(mcs, name, bases, attrs):
for attr in meta_attrs:
attrs[attr] = attr.upper()
return type.__new__(mcs, name, bases, attrs)
if __name__ == '__main__':
print C.alpha, C.beta, C.gamma
print D.alpha, D.beta, D.gamma
세 번째 옵션은 속성을 설정하는 클래스 데코레이터 또는 팩토리 함수입니다. – kindall