파이썬의 클래스 상수


128

파이썬에서는 클래스에 모든 서브 클래스에서 공통적 인 "상수"(실제로 변수)를 갖기를 원합니다. 친근한 문법으로 할 수있는 방법이 있습니까? 지금 나는 사용합니다 :

class Animal:
    SIZES=["Huge","Big","Medium","Small"]

class Horse(Animal):
    def printSize(self):
        print(Animal.SIZES[1])

"동물"이라고 쓰지 않고도 더 좋은 방법이 있는지 궁금합니다. 크기 전에. 감사! 편집 : 말이 동물에서 물려받은 것을 언급하는 것을 잊었습니다.


16
완전한 답변은 아니지만 SIZES변경되지 않는 경우 목록 대신 튜플을 사용하십시오. 그래서처럼("Huge","Big","Medium","Small")
jamylak

답변:


141

Horse의 하위 클래스 이므로 Animal변경할 수 있습니다.

print(Animal.SIZES[1])

print(self.SIZES[1])

그래도 SIZES[1]"큰" 이라는 의미 를 기억해야 하므로 다음과 같은 방법으로 코드를 향상시킬 수 있습니다.

class Animal:
    SIZE_HUGE="Huge"
    SIZE_BIG="Big"
    SIZE_MEDIUM="Medium"
    SIZE_SMALL="Small"

class Horse(Animal):
    def printSize(self):
        print(self.SIZE_BIG)

다른 방법으로, 중간 클래스를 만들 수 있습니다 HugeAnimal, BigAnimal그리고에 이렇게. 각 동물 클래스에 다른 논리가 포함되어 있으면 특히 유용합니다.


SIZE_BIG = [ "BigOne", "BigTwo"]이 유형의 상수를 사용해야합니다.
Lova Chittumuri

17

(인스턴스 메소드에서) 또는 (클래스 메소드에서 ) 를 사용 SIZES하여 갈 수 있습니다 .self.SIZEScls.SIZES

어쨌든 어디에서 찾을 수 있는지 명시해야합니다 SIZES. 대안은 SIZES클래스를 포함하는 모듈 에 넣는 것이지만 모든 클래스를 단일 모듈로 정의해야합니다.


말은 실제로 동물의 하위 클래스입니다. 실제로 Animal.SIZES [1] 대신 self.SIZES [1]을 사용하는 것이 완벽하게 가능합니다.
betabandido

@betabandido : OP가 질문을 수정했습니다. 그에 따라 답변을 업데이트합니다.
Fred Foo

12
class Animal:
    HUGE = "Huge"
    BIG = "Big"

class Horse:
    def printSize(self):
        print(Animal.HUGE)

또한 당신은 예를 들어, 자기를 통해 액세스 할 수 있습니다. "self.HUGE"또는 "self.BIG". 이것은 내부적으로 만 수업 내에서 작동합니다.
cevaris

4

betabandido의 답변을 확장하여 속성을 상수로 모듈에 주입하는 함수를 작성할 수 있습니다.

def module_register_class_constants(klass, attr_prefix):
    globals().update(
        (name, getattr(klass, name)) for name in dir(klass) if name.startswith(attr_prefix)
    )

class Animal(object):
    SIZE_HUGE = "Huge"
    SIZE_BIG = "Big"

module_register_class_constants(Animal, "SIZE_")

class Horse(Animal):
    def printSize(self):
        print SIZE_BIG

print SIZE_BIG수업 시간이 동일합니까? 편집 가능 Animal.SIZE_HUGE = 'Small'합니까?
십자군
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.