Tôi đang ghi đè phương thức __new__()
của một lớp để trả về một cá thể lớp có tập hợp __init__()
cụ thể. Python dường như gọi đẳng cấp cung cấp __init__()
phương pháp thay vì phương pháp dụ cụ thể, mặc dù các tài liệu Python tạiTại sao Python không gọi phương thức instance __init __() khi tạo cá thể nhưng các lớp gọi __init __() thay thế?
http://docs.python.org/reference/datamodel.html
nói:
triển khai điển hình tạo một đối tượng mới của lớp bằng gọi phương thức __new __() của lớp cha bằng cách sử dụng siêu (lớp hiện tại, cls) .__ new __ (cls [, ...]) với các đối số thích hợp và sau đó sửa đổi trường hợp mới tạo thành cần thiết trước khi trả về.
Nếu __new __() trả về một thể hiện của cls, sau đó các trường hợp mới của __init __() phương pháp sẽ được gọi như __init __ (tự [, ...]), nơi tự là trường hợp mới và đối số còn lại là giống như đã được chuyển đến __new __().
Đây là mã thử nghiệm của tôi:
#!/usr/bin/env python
import new
def myinit(self, *args, **kwargs):
print "myinit called, args = %s, kwargs = %s" % (args, kwargs)
class myclass(object):
def __new__(cls, *args, **kwargs):
ret = object.__new__(cls)
ret.__init__ = new.instancemethod(myinit, ret, cls)
return ret
def __init__(self, *args, **kwargs):
print "myclass.__init__ called, self.__init__ is %s" % self.__init__
self.__init__(*args, **kwargs)
a = myclass()
mà kết quả đầu ra
$ python --version
Python 2.6.6
$ ./mytest.py
myclass.__init__ called, self.__init__ is <bound method myclass.myinit of <__main__.myclass object at 0x7fa72155c790>>
myinit called, args =(), kwargs = {}
Có vẻ như cách duy nhất để có được myinit()
để chạy, là để gọi nó một cách rõ ràng như self.__init__()
bên myclass.__init__()
.
Great câu hỏi! – Marcin