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?
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
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