2012-02-06 6 views
5

Có cách nào để thực hiện điều gì đó như thế này không? Tôi làm việc trong Python, nhưng tôi không chắc chắn nếu có một cách để làm điều đó trong bất kỳ ngôn ngữ lập trình ...thừa kế trên thuộc tính lớp (python)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

Tôi biết tôi không thể gọi __class__ trực tiếp. Nó chỉ là một ví dụ, bởi vì tôi muốn một cái gì đó giống như tham chiếu đến chính lớp đó, bởi vì tôi muốn lớp con hành động khác nhau dựa trên class_attribute của nó.

Và sau đó đầu ra phải nên như thế này:

> Parent.class_method() 
"parent" 
> Child.class_method() 
"child" 

Tôi biết các kỹ thuật tương tự có thể được thực hiện thông qua các trường hợp. Nhưng tôi không muốn tạo các cá thể, bởi vì đôi khi mã trong phương thức __init__ có thể dài và đòi hỏi và nếu tôi muốn gọi class_method thường xuyên, tôi sẽ phải tạo nhiều cá thể được sử dụng chỉ cho cuộc gọi phương thức này. Và bởi vì class_attributeclass_method là tĩnh và sẽ không bị thay đổi theo các trường hợp.

+0

bạn đang nói về các hàm 'tĩnh' đơn giản? – Tigran

Trả lời

9

Er, âm thanh như bạn muốn có một classmethod, mà không đáng ngạc nhiên được thực hiện với classmethod trang trí:

class Parent(object): 
    class_attribute = "parent" 

    @classmethod 
    def class_method(cls): 
     print cls.class_attribute 

class Child(Parent): 
    class_attribute = "child" 


>>> Parent.class_method() 
parent 
>>> Child.class_method() 
child 

Hoặc , như bgporter chỉ ra, bạn có thể làm điều đó trực tiếp với các thuộc tính, mà không cần các phương thức nào cả.

+0

vâng, đây chính xác là những gì tôi muốn, cảm ơn rất nhiều! – davekr

+0

nhưng xem xét tài liệu: "nếu một phương thức lớp được gọi cho một lớp dẫn xuất, đối tượng lớp dẫn xuất ** được truyền như đối số đầu tiên ngụ ý", có nghĩa là đối tượng lớp dẫn xuất sẽ được tạo theo bất kỳ cách nào không? Bởi vì OP nói rằng muốn tránh trường hợp constructon. – Tigran

+0

Tôi muốn gọi phương thức này, bởi vì đoạn mã trong phương thức thực sự có thể làm điều phức tạp hơn, sau đó chỉ cần in các thuộc tính. Tôi mặc dù làm cho một exmaple dễ dàng hơn sẽ làm cho giải thích dễ dàng hơn về những gì tôi muốn ... vì vậy @classmethod là một giải pháp – davekr

3

Nó chỉ hoạt động bằng Python, có hoặc không tạo ra các trường hợp:

>>> class Parent(object): 
... attribute = "parent" 
... 
>>> class Child(Parent): 
... attribute = "child" 
... 
>>> p = Parent() 
>>> p.attribute 
'parent' 
>>> c = Child() 
>>> c.attribute 
'child' 
>>> Parent.attribute 
'parent' 
>>> Child.attribute 
'child' 
>>>