Tôi đã tự hỏi điều gì sẽ xảy ra với các phương thức được khai báo trên một metaclass. Tôi hy vọng rằng nếu bạn khai báo một phương thức trên một metaclass, nó sẽ kết thúc là một classmethod, tuy nhiên, hành vi là khác nhau. Ví dụphương pháp metaclasses trên các cá thể lớp
>>> class A(object):
... @classmethod
... def foo(cls):
... print "foo"
...
>>> a=A()
>>> a.foo()
foo
>>> A.foo()
foo
Tuy nhiên, nếu tôi cố gắng xác định một metaclass và cho nó một phương pháp foo, có vẻ như hoạt động tương tự đối với lớp học, không phải cho cá thể.
>>> class Meta(type):
... def foo(self):
... print "foo"
...
>>> class A(object):
... __metaclass__=Meta
... def __init__(self):
... print "hello"
...
>>>
>>> a=A()
hello
>>> A.foo()
foo
>>> a.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'foo'
Điều gì đang diễn ra ở đây chính xác?
chỉnh sửa: chạm các câu hỏi
Đây có phải là http://stackoverflow.com/questions/1770712/metaclass-not-being-called-in-subclasses cùng một vấn đề cơ bản không? –
@Stefano: vậy, bạn không hài lòng với câu trả lời của tôi là bạn? :-) –
@Olivier: tuyệt đối! rõ ràng và tuyến tính. Nhờ bạn và tất cả những người khác nữa. –