Hằng số lớp trong python


128

Trong python, tôi muốn một lớp có một số "hằng" (thực tế là các biến) sẽ phổ biến trong tất cả các lớp con. Có cách nào để làm điều đó với cú pháp thân thiện? Ngay bây giờ tôi sử dụng:

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

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

và tôi tự hỏi liệu có cách nào tốt hơn để làm điều đó hay cách để làm điều đó mà không cần phải viết "Động vật". trước các kích cỡ. Cảm ơn! chỉnh sửa: quên đề cập rằng ngựa thừa hưởng từ động vật.


16
Không phải là một câu trả lời đầy đủ nhưng nếu SIZESkhông bao giờ thay đổi, chắc chắn sử dụng một tuple thay vì một danh sách. Giống như vậy("Huge","Big","Medium","Small")
jamylak

Có vẻ như bạn thực sự sau một enum ở đây
Eric

Câu trả lời:


141

Horselà một lớp con của Animal, bạn chỉ có thể thay đổi

print(Animal.SIZES[1])

với

print(self.SIZES[1])

Tuy nhiên, bạn cần nhớ điều đó SIZES[1]có nghĩa là "lớn", vì vậy có lẽ bạn có thể cải thiện mã của mình bằng cách thực hiện một số việc như:

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

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

Ngoài ra, bạn có thể tạo các lớp trung gian : HugeAnimal, BigAnimalv.v. Điều đó sẽ đặc biệt hữu ích nếu mỗi lớp động vật sẽ chứa logic khác nhau.


SIZE_BIG = ["BigOne", "BigTwo"] tôi sẽ sử dụng loại hằng này.
Lova Chittumuri

17

Bạn có thể nhận được SIZESbằng phương tiện self.SIZES(trong một phương thức thể hiện) hoặc cls.SIZES(trong một phương thức lớp).

Trong mọi trường hợp, bạn sẽ phải rõ ràng về nơi để tìm SIZES. Một cách khác là đưa SIZESvào mô-đun chứa các lớp, nhưng sau đó bạn cần xác định tất cả các lớp trong một mô-đun.


Ngựa thực sự là một lớp con của Động vật. Trên thực tế, hoàn toàn có thể sử dụng self.SIZES [1] thay vì Animal.SIZES [1].
betabandido

@betabandido: OP đã sửa câu hỏi. Sẽ cập nhật câu trả lời cho phù hợp.
Fred Foo

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

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

Ngoài ra, bạn có thể truy cập thông qua tự, ví dụ. "Tự.HUGE" hoặc "tự.BIG". Điều này sẽ chỉ làm việc nội bộ trong lớp.
cevaris

4

Mở rộng câu trả lời của betabandido, bạn có thể viết một hàm để thêm các thuộc tính dưới dạng hằng vào mô-đun:

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_BIGRa lớp sẽ giống nhau? Nó sẽ được chỉnh sửa Animal.SIZE_HUGE = 'Small'?
Thập tự quân
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.