2015-04-20 12 views
5

Giả sử tôi muốn có một tuỳ chỉnh frozenset với 2 phần tử, lặp lại, băm, so sánh và có nhiều hoạt động tốt khác nhau dưới dạng hàng rào, nhưng in khác nhau.Tùy biến các loại không thay đổi trong Python

>>> p = edge(5, 7) 
>>> p == edge(7, 5) 
True 
>>> p 
edge(5, 7) 

Tôi có thể kế thừa hoặc tôi có thể ủy quyền, nhưng trong mọi trường hợp tôi không nhận được những gì tôi muốn.

Nếu tôi thừa kế theo nghĩa đen, dường như không có cách nào tôi có thể viết __init__, bởi vì cha mẹ tôi không thay đổi. Tôi thể chỉ cần viết:

class edge: 
    def __new__(cls, a, b): 
     return frozenset({a, b}) 

nhưng sau đó tôi nhận được một frozenset đúng đắn và không thể tuỳ chỉnh __repr__ của nó, đó là những gì tôi muốn làm. Tôi không thể làm cho super() hoạt động ở đây theo bất kỳ cách nào tốt đẹp.

Nếu tôi ủy quyền, tôi có thể ghi đè __getattr__ hoặc __getattribute__, nhưng không ai trong số họ thực sự hoạt động khi ví dụ __iter__ được tìm kiếm. Tôi đoán các phương pháp đặc biệt quá đặc biệt ở đây. Giải pháp duy nhất tôi hiện có là phân bổ thủ công mọi phương pháp đặc biệt mà tôi có thể nghĩ đến, nhưng chắc chắn phải có cách tốt hơn. Bất kỳ ý tưởng?

+1

Tôi không rõ bạn muốn làm gì. Bạn chỉ muốn thay đổi '__repr__', hay bạn cũng muốn thay đổi' __init__'? Vì bạn không cần ghi đè '__init__' nếu bạn chỉ muốn thay đổi' __repr__'. – TheBlackCat

+0

Thay đổi '__repr__' là ưu tiên. Nhưng tôi nghĩ tôi cũng có thể thay đổi việc xây dựng các cạnh mới để loại bỏ các {} s không cần thiết, khi tôi đang viết một lớp mới. – Veky

Trả lời

2

Ngớ ngẩn tôi. Nó hoạt dộng bây giờ. Nếu ai đó muốn biết làm thế nào để làm điều đó, ở đây nó là:

class pair(frozenset): 
    def __new__(cls, a, b): 
     return super().__new__(cls, {a, b}) 
    def __repr__(self): 
     a, b = sorted(self) 
     return "{} & {}".format(a, b) 

Các lỗi là tôi gọi super().__new__({a, b}) nghĩ rằng nó sẽ biến hình của tôi cls trong cùng một cách nó với self, khi gọi không có đối số. Tất nhiên, __new__ là classmethod ngầm đã không giúp đỡ. :-)

Các vấn đề liên quan