2017-12-03 3 views
1

나는 메타 클래스를 만들려고하고 있는데, 나는 정말로 그것을 얻고 있다고 생각하고 있었다. 그리고이 메타 클래스의 각 인스턴스에 대해 클래스 메서드를 갖고 싶습니다.서로 호출하는 메타 클래스 메서드의 모범 사례는 무엇입니까?

[pylint] E1120:No value for argument 'cls' in unbound method call 

내가 코드를 실행하려고 (내 코드는 이것보다 더 복잡하다)이 잘 실행하고 일을 할 나타납니다

class MyMeta(type): 
    """A metaclass""" 
    def __new__(mcs, name, bases, attributes): 
     pass 

    def _foo(cls): 
     pass 

    def _bar(cls): 
     cls._foo() 

나는 그것에 pylint를 실행

cls._foo 어려움이있다 나는 그것을 기대하고 있습니다. 이 사건을 어떻게 수정해야합니까? 정확히 무엇을 의미하는지.

@staticmethods으로 올바르게 선언하지 않는 것과 관련된 다른 오류가 들리지만, @classmethod으로 표시 할 수 없습니다. 그 이유는 Metaclass 메서드이기 때문입니다.

관련 검색은 사람들이 생성자 또는 무언가를 동적으로 추가하는 장소에 대해 이야기하는 것처럼 보입니다. 그렇다고 생각하지 않습니다. 나는 아직도 메타 클래스에 관한 어떤 것을 오해하고 있는가?

정말 원하는 것은 메타 클래스로 정의 된 서로를 호출하는 클래스 메서드입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

https://stackoverflow.com/questions/35208443/pylint-complains-no-value-for-argument-cls – SteveJ

+0

@SteveJ 내가 언급 한 경우가 특히 그렇습니다. 이 질문에서 OP는 파생 클래스에서 생성자가 선언 될 것으로 기대하고 있습니다. 이것은 여기에 해당하지 않습니다. – McKay

답변

1

는 [pylint] E1120 : 언 바운드 메서드 호출에 인수 없음 값 'CLS'

는 는

는 지금까지, 당신의 _foo_bar 방법 그냥 일반 파이썬 방법입니다 귀하의 metaclasss에 관한 한

- 이는 파이썬을 의미 이러한 메소드를 호출 할 때 자동으로 각 클래스 (메타 클래스 인스턴스)에 대한 참조를 채 웁니다.

그리고 이것은 메타 클래스이므로 명확성, 의미 및 가독성을 위해 먼저 self 대신 cls이라는 첫 번째 매개 변수를 지정하십시오.

문제는 단지 pylint가 그것에 대해 안다는 것입니다. 즉, 하드 코딩 된 self을 기대할 가능성이 높습니다. 이 점에서 코드는 비공개입니다.

당신이해야 할 일은 pylint가 이러한 행을 무시하는 meta-comment fo를 추가하는 것입니다. fortunatelly, Pylint는 각 행에 표시해야하는 툴과 달리 블록 레벨에서 허용합니다. 은 "메타 코멘트"로

class MyMeta(type): 
    """A metaclass""" 
    # pylint: disable=no-value-for-parameter 

    def __new__(mcs, name, bases, attributes): 
     pass 

    def _foo(cls): 
     pass 

    def _bar(cls): 
     cls._foo() 

귀하의 예를 들어 메타 클래스는, 그래서 pylint이 아닌 오류를 무시합니다.

+0

+1, 이것은 많은 의미가 있습니다. 하지만 당신의 대답은 "나는 이것이 pylint의 버그/한계라고 생각합니다. 그냥 사용하지 마십시오."라고 생각합니다. 나는 네가 틀렸다고 생각하지 않지만 여기에 권위있는 것은 아무것도 없다. – McKay

+0

질문 제목을 좀 더 명확하게 편집했습니다. – McKay

+0

내 대답은 변하지 않을 것입니다. "당신이 한 일을하는 것이 훨씬 낫습니다"라는 부분이 있습니다. 메타 클래스의 이러한 메서드는 클래스 인스턴스에 표시되지 않으므로 클래스 메서드 만 나타납니다. (때로는 장점과 디자인이기도하고 파이썬의 datetime을 원합니다.datetime') – jsbueno