1

원하는 코드 출력은 b 인스턴스를 보유하는 하나의 항목이있는 클래스 변수 Team.stuff가 있고 Player.stuff 변수가 비어 있어야합니다. 대신에 나는Python 클래스 상속, __init__ 및 cls

cls.stuff.append(self) 
NameError: global name 'cls' is not defined 

내가 Team.__init__()의 CLS 변수를 전달할 수 ...

class Player: 
    stuff=[] 
    def __init__(self): 
    cls.stuff.append(self) 

class Team(Player): 
    def __init__(self): 
    super(Team, self).__init__() 

b=Team() 

ERROR 오류가 발생하지만이 "올바른"방법입니다 있는지 확실하지 않습니다, 그리고 더 많은 중요한 것은 Player.__init__()은 클래스 변수가 필요할 것이고, 어떻게해야하는지에 대한 구문에 대해서는 잘 모르겠습니다.

답변

0

cls은 파이썬에서 키워드가 아닙니다. 오히려 그것은 메소드가 클래스 함수이고 특정 인스턴스에서 호출되는 메소드가 아닌 경우 메소드의 첫 번째 인수에 대한 규칙입니다. 당신이 함수의 속성stuff를 원하는 경우에

, 그렇게처럼 정의 할 수 있습니다 self.stuff=[]은.

그런 다음 방법에서 참조 할 때는 self 키워드 (self.stuff.append(..))를 사용하십시오.

0

__init__ 함수의 cls 함수가 정의되어 있지 않기 때문입니다. 인수 이름 selfcls명명 규칙입니다. 실제로 각각 인스턴스와 클래스 메소드에 대해 foobar으로 이름을 지정할 수 있으며 foo은 클래스 인스턴스를 가리키고 bar은 클래스 자체를 가리 킵니다.

더욱이 self.stuff은 속성을 검색 할 때 유효하며 개체에 __dict__ 사전에 해당 이름의 속성이없는 경우 해당 클래스의 __dict__이 대신 보입니다. 둘 다 누락 된 경우 mro 순서에 따라 추가 조회가 수행됩니다.

공지 사항 는 개체 인스턴스, 그것은 것 그림자 클래스 정의에 속성 stuff을 설정하면 한 번, 그.

class MyClassA(object): 
    stuff = [] 

class MyClassB(MyClassA): 
    def __init__(foobar): 
     # `foobar` points at the instance of `MyClassB` class. 

     # MyClassA.stuff gets `1` object appended to it. 
     foobar.stuff.append(1) 

     # This should print '[1]' 
     print foobar.stuff 

     # `MyClassB` object gets a _new_ attribute named `stuff` pointing at a list. 
     foobar.stuff = [] 

     # This should print '[]'. 
     print foobar.stuff 
1
class Player(object): 
    stuff=[] 
    def __init__(self): 
     self.stuff.append(self) 

class Team(Player): 
    def __init__(self): 
     super(Team, self).__init__() 

b = Team() 
print(Team.stuff) 

인쇄 (같은)

[<__main__.Team object at 0xb7519dec>] 
+0

감사하지만 내가 필요하지 않습니다 :

예에 의해 설명. 인쇄가 필요합니다 (Team.stuff), 인쇄하지 않습니다 (b.stuff) – appleLover

+0

시도해 보셨습니까? – Matthias