2009-06-23 13 views
2

나 자신에게 다음과 같은 코드를 작성하여 입력의 비트를 저장하기 위해 노력하고 있어요,하지만 난 할 수없는 것 같다파이썬 클래스 속성 상속

class lgrAdminObject(admin.ModelAdmin): 
    fields = ["title","owner"] 
    list_display = ["title","origin","approved", "sendToFrames"] 

class Photos(lgrAdminObject): 
    fields.extend(["albums"]) 

왜 그 일을하지 않습니다? 그렇지 않은 기능에 있기 때문에 또한, 나는

fields = super(Photos, self).fields 
fields.extend(["albums"]) 

답변

7

상속 클래스의 몸이 실행 후 을 적용 슈퍼 트릭을 할 수 없습니다. 클래스 본문에서는 lgrAdminObject.fields을 사용할 수 있습니다 - 먼저 수퍼 클래스의 복사본을 만드는 대신에 수퍼 클래스의 속성을 변경 하시겠습니까? 특이한 것 같습니다 ... 사본을 가지고 시작하겠습니다 :

class Photos(lgrAdminObject): 
    fields = list(lgrAdminObject.fields) 

변경을 계속하기 전에.

+0

방금 ​​예제를 들려 주었지만, 맞습니다. 변경하기 전에 먼저 목록을 복사하고 싶습니다.) – Jiaaro

4

시도해 보셨습니까?

fields = lgrAdminObject.fields + ["albums"] 

새 클래스 속성을 생성해야합니다. 상위 클래스에서 속성을 확장하지 않아야합니다.

2

클래스 속성 사용을 주장하는 경우 직접 기본 클래스를 참조 할 수 있습니다.

class Photos(lgrAdminObject): 
    lgrAdminObject.fields.extend(["albums"]) 

일반의 검사는 다음과 기본 속성이 당신이 찾고 있던 아마 것뿐만 아니라 수정처럼

>>> class B0: 
...  fields = ["title","owner"] 
...  
>>> class C1(B0): 
...  B0.fields.extend(["albums"]) 
...  
>>> C1.fields 
['title', 'owner', 'albums'] 
>>> B0.fields 
['title', 'owner', 'albums'] 
>>> 

보인다. 일부 실행 방법을 정의하십시오 (__init__(), 아마도?).

또는 (더 나은?) 기본 속성 @ 알렉스 마르 텔리의 제안에 따라 복사 : 또한

>>> class B0: 
...  fields = ["title","owner"] 
... 
>>> class C1(B0): 
...  fields = B0.fields[:] 
...  fields.extend(["albums"]) 
...  
>>> C1.fields 
['title', 'owner', 'albums'] 
>>> B0.fields 
['title', 'owner'] 
>>> 
1

을, 당신은 클래스 속성으로 목록이있을 때, 그것은 클래스가 아닌 인스턴스를 속해 있습니다 . 수정하면 모든 인스턴스에 대해 변경됩니다. 이 효과를 사용하여 수정하지 않는 한 튜플을 사용하는 것이 좋습니다 (혼동의 원인이되기 때문에 명확하게 문서화해야합니다).