Cách ghi đè __getattr__
bằng python 3 và kế thừa?đối tượng 'siêu' không có thuộc tính '__getattr__' trong python3
Khi tôi sử dụng như sau:
class MixinA:
def __getattr__(self, item):
# Process item and return value if known
if item == 'a':
return 'MixinA'
# If it is unknown, pass it along to give
# a chance to another class to handle it
return super().__getattr__(item)
class MixinB:
def __getattr__(self, item):
# Process item and return value if known
if item == 'b':
return 'MixinB'
# If it is unknown, pass it along to give
# a chance to another class to handle it
return super().__getattr__(item)
class Example(MixinA, MixinB):
# main class
pass
tôi nhận được lỗi này.
>>> e = Example()
>>> e.a
'MixinA'
>>> e.b
'MixinB'
>>> e.c
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
...
AttributeError: 'super' object has no attribute '__getattr__'
Tôi không thể lấy lỗi thuộc tính tham chiếu đến lớp và thuộc tính gốc? Đó là để nói:
AttributeError: 'Example' object has no attribute 'c'
PS: Tôi thấy bài này 'super' object not calling __getattr__ nhưng tôi không chắc chắn để hiểu liệu có một giải pháp.
Đây là trường hợp sử dụng con áp phích để sử dụng 'thuộc tính'. – dursk
@mattm Ý của bạn là gì? Bạn có thể rõ ràng hơn không? Tôi không muốn sử dụng các thuộc tính. Hãy để tôi cố gắng giải thích thêm những gì tôi đang cố gắng đạt được. Tôi đang tạo một số mixin để tự động thêm các tùy chọn bổ sung vào một số thuộc tính dựa trên tên của chúng. Ví dụ: nếu một attr kết thúc bằng '_logs', thì bạn có thể lấy đoạn trích bằng cách thêm' __excerpt' => ví dụ: nếu obj có thuộc tính 'xxx_logs',' obj.xxx_logs__excerpt' sẽ bị chặn và sẽ hoạt động. – Michael