>

2 개의 수업이 있습니다 :

class Parent(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name
        self.__parent_vars = ['id', 'name']  # make a copy
    def print_values(self):
        res = {}
        for el in self.__parent_vars:
            res[el] = vars(self)[el]
        return res

class Child(Parent):
    def __init__(self, id, name, last_name, age):
        Parent.__init__(self, id, name)
        self.last_name = last_name
        self.age = age

내가하고 싶은 것은- Child 에서 얻는 것입니다   Parent 의 매개 변수  수업. 추가 변수를 사용하여 만들었고 작동하지만 추가 변수없이 더 우아한 솔루션이 필요합니다. 피클 수업에 필요합니다. 추가 변수를 만들면 큰 프로젝트에서 스키마가 손상됩니다.

다음과 같은 것을 찾으려고 노력합니다 :

c = Child(12,"Foo","whatever",34)
vars(c.super())

예상되는 출력으로 :

{'id': 12, 'name': 'Foo'}

<시간>

이 질문을 찾았습니다 : 기본 클래스 (Python)에서만 속성을 가져옵니다 . 해당 솔루션을 사용할 수 없습니다.

  • 답변 # 1

    당신이 쉽게 할 수 없을 까봐 걱정됩니다. 파이썬에서 클래스는 메소드와 정적 속성 만 가지고 있습니다. 비 정적 속성은 일반적으로 __dict__ 에 저장됩니다  객체의 속성. 즉, 특별한 경우를 제외하고 부모 클래스 메서드, 자식 클래스 메서드 또는 메서드 외부에 할당 된 속성을 쉽게 알 수 없습니다.

    __init__ 를 계측하는 meta_class 만 상상할 수 있습니다  호출 중에 변경된 속성을 저장하는 방법 :

    import collections
    import functools
    import inspect
    class Meta_attr(type):
        init_func = {}
        attrs = collections.defaultdict(set)
        def __new__(cls, name, bases, namespace, **kwds):
            c = type.__new__(cls, name, bases, namespace, **kwds)
            cls.init_func[c] = c.__init__
            @functools.wraps(c.__init__)
            def init(self, *args, **kwargs):
                before = set(self.__dict__.keys())
                cls.init_func[c](self, *args, **kwargs)
                after = set(self.__dict__.keys())
                cls.attrs[c].update(after.difference(before))
            init.__signature__ = inspect.signature(c.__init__)
            c.__init__ = init
            return c
    class Parent(object, metaclass=Meta_attr):
        def __init__(self, id, name):
            self.id = id
            self.name = name
        def print_values(self):
            res = {}
            for el in Meta_attr.attrs[Parent]:
                res[el] = vars(self)[el]
            return res
    
    class Child(Parent):
        def __init__(self, id, name, last_name, age):
            Parent.__init__(self, id, name)
            self.last_name = last_name
            self.age = age
    
    

    다음을 제공합니다 :

    >>> c = Child(1,"a","b", 20)
    >>> c.print_values()
    {'id': 1, 'name': 'a'}
    
    

    BEWARE: 속성이 __init__ 외부에 설정된 경우  이 메소드는이 메타 클래스에 의해 등록되지 않습니다 ...

관련 자료

  • 이전 javascript - 오프 스크린 캔버스에 대한 지원 확인
  • 다음 spring boot - 동시 다중 요청을 수신 할 때 히카리 연결 풀이 1 개 또는 2 개의 연결 만 사용하는 이유는 무엇입니까?