내가 먼저 인스턴스가 생성 될 때 클래스 변수를 초기화 메타 클래스를 구현하기 위해 노력하고 내부 호출하지 않습니다. 클래스 메서드 (예 : __new__
)로 호출되어야하는 새로운 마법 메서드 __load__
을 유지하고 싶습니다. 그래서 이런 식으로 구현 : 그것은 잘 작동하고 정확한 결과를 제공'classmethod'객체는 파이썬 3에서 메타 클래스의 방법
class StaticLoad(type):
__loaded_classes = set()
def __call__(cls, *args, **kwargs):
if cls not in cls.__loaded_classes:
if hasattr(cls, '__load__'):
cls.__load__()
cls.__loaded_classes.add(cls)
return super().__call__(*args, **kwargs)
class BaseClass(metaclass=StaticLoad):
s = 0
class MyClass(BaseClass):
@classmethod
def __load__(cls):
print("Loading", cls.__name__, "...")
cls.s += 1
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.s)
: 할 필요없이 (
Loading MyClass ...
1
가 지금은 __new__
같은 기본적으로 classmethod 같은 방법 __load__
을 구현하려는를 매번 위에 @classmethod
을 입력하십시오.
Traceback (most recent call last):
File "example.py", line 22, in <module>
obj1 = MyClass()
File "example.py", line 7, in __call__
classmethod(cls.__load__)()
TypeError: 'classmethod' object is not callable
classmethod
루틴은 클래스 정의 내에서 제대로 볼 수 있습니다처럼 보이는 : 나는 오류가 발생했습니다
class StaticLoad(type):
__loaded_classes = set()
def __call__(cls, *args, **kwargs):
if cls not in cls.__loaded_classes:
if hasattr(cls, '__load__'):
# I try to apply classmethod routine to make
# cls.__load__ a classmethod
classmethod(cls.__load__)()
cls.__loaded_classes.add(cls)
return super().__call__(*args, **kwargs)
class BaseClass(metaclass=StaticLoad):
s = 0
class MyClass(BaseClass):
# @classmethod line was deleted
def __load__(cls):
print("Loading", cls.__name__, "...")
cls.s += 1
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.s)
: 나는 이것을 시도했다.
어떻게하면 잘 작동하도록 내 메타 클래스를 개선해야합니까? 위에서 쓴대로 클래스 BaseClass
과 MyClass
의 내용을 유지하고 모든 마법을 StaticLoad
에 넣고 싶습니다. @AnttiHaapala의 도움으로
'의 CLS .__ 부하 __()'나'의 CLS .__ 부하 __ (CLS)가'작동하지 않습니다! 놀랍게도 * classmethod 객체 *는 ** 호출 가능하지 않습니다. 그것의'__get__'은 호출 가능한 객체가 클래스 나 인스턴스에서 조회 될 때 그것을 반환합니다. –
나는'cls .__ load __ (cls)'를 호출하려하지 않았다. – Fomalhaut
@AnttiHaapala 그것을'cls .__ load __ (cls)'로 대체하는 것이 도움이되었습니다. 감사합니다. – Fomalhaut