홈>
나는
'class repr'
를 정의 할 수있는 능력을 알고있다
메타 클래스를 사용하여. 그러나 메타 클래스를 자체
__repr__
로 반환하는 기능이 필요합니다.
이와 같이 :
class Meta(type):
def __repr__(cls):
return 'Person class: {}'.format(cls.__name__)
class Person(metaclass=Meta):
def __init__(self, name, age, job):
self.name = name
self.job = job
self.age = age
def __str__(self):
return 'Person: {}, {}, {}'.format(self.name,
self.age,
self.job)
class Employee(Person):
def __init__(self, name, age):
super(Employee, self).__init__(name, age, 'employee')
class Manager(Person):
def __init__(self, name, age):
super(Manager, self).__init__(name, age, 'manager')
m = Manager('bob', 79)
e = Employee('stephen', 25)
예상대로,
type(e)
그리고
type(m)
각각의
'Person class: ...'
를 반환
그러나 내가
type(Employee)
하면
나는
<class '__main__.Meta'>
를 얻는다
. 이 클래스에는 자체
__repr__
가 있어야합니다.
실제 사용중인 구현은 기본
Type
로 구성됩니다.
String
의 서브 클래스가있는 클래스
Number
등. 인스턴스에서 호출 유형은 잘 작동하지만 유형이 클래스에서도 호출 될 수 있으므로보다 '사용자 친화적 인'반환 문자열이 필요합니다.- 답변 # 1
- 답변 # 2
간단한 해결책을 찾았습니다. 내 클래스 구조 (상속 트리)는 다음과 같으므로 다음 클래스를 아래로 반환하면됩니다.
MM
내 코드에 넣은 것은 다음과 같습니다 :
MetaType: metaclass with __repr__ | Type: base class | builtins: e.g. String, Number
t = type(self.parse(args['object'])) # where 'self.parse' is the parsing method for the argument to my function # where args['object'] is the object whose type is being returned if t == MetaType: return Type return t
관련 질문
- Python의 상위 개체에서 하위 개체를 만들 수 있습니까?
- PYTHON-최소 3자리 숫자 반환
- Python을 사용하여 여러 애플리케이션 열기
- python : PyCharm은 dict 생성 속성의 확인되지 않은 속성에 대해 경고합니다.
- python : 지수 형식/과학 표기법 없이 십진수를 인쇄하는 방법은 무엇입니까?
- python : opencv에서 인수 오류가 계속 발생합니까?
- python : Sphinx는 :param 및 :return을 제대로 인식하지 못합니다.
- python : super가 항상 __init__에서 호출되어야 하는 이유
- python : 값이 두 번 이상 나타나면 값을 취하는 목록 만들기
- bash 스크립트에서 올바른 Python 설치를 동적으로 선택하십시오.
실제로 pyzwyz로 메타 메타 클래스를 작성하는 것을 막을 수있는 것은 아무것도 없습니다. 메타 클래스 자체 :
In [2]: class MM(type): ...: def __repr__(cls): ...: return f"<metaclass {cls.__name__}" ...: In [3]: class M(type, metaclass=MM): ...: def __repr__(cls): ...: return f"<class {cls.__name__}>" ...: In [4]: class O(metaclass=M): ...: pass ...: In [5]: o = O() In [6]: o Out[6]: <<class O> at 0x7ff7e0089128> In [7]: O Out[7]: <class O>
의 출력 :(여기서 혼란스러운 것은
In [8]: repr(M) Out[8]: '<metaclass M'
입니다. 또한type
의 메타 클래스입니다. 그 자체-그것은 M이type
에서 상속받지 않는다는 점에서 여기에 반영됩니다. 오히려 메타 클래스로 사용하십시오.)