Tôi đang thiết kế một lớp cơ sở và tôi muốn nó như vậy sao chép.copy
Xác định hành vi cơ bản Hành vi này bao gồm việc in cảnh báo trong bảng điều khiển rồi sao chép phiên bản như thể nó không hề sao chép __sao chép__
Như nhau. tài sản.
Khi xác định một khoảng trốngFoo
lớp và sao chép một thể hiện của nó, sao chép
Hàm trả về một phiên bản mới của lớp, như được hiển thị trong phiên sau:
>>> lớp Foo: vượt qua
...
>>> foo = Foo()
>>> foo2 = sao chép(foo)
>>> foo là foo2
SAI
Bây giờ nếuFoo
lớp được định nghĩa __sao chép__
phương thức cá thể, khi cố gắng truyền một cá thể tới sao chép
Cái sau sẽ được gọi khi:
>>> lớp Foo:
... def __copy__(self):
...print("Đang sao chép")
...
>>> foo = Foo()
>>> sao chép(foo)
Sao chép
Theo như tôi biết, sao chép
Hàm luồng thực thi sẽ là:
- Cố gắng truy cập vào đối tượng
__sao chép__
属性
- Nếu có thì gọi
- Trong trường hợp vắng mặt, thực hiện một bản sao phổ quát
Nhưng bây giờ tôi muốn nắm bắt sao chép
chức năng đang truy cập __sao chép__
Thuộc tính, theo định nghĩa __getattr__
phương pháp và sau đó nâng nó lên bằng cách Lỗi thuộc tính
để mô phỏng sự vắng mặt của thuộc tính này. :
>>> lớp Foo:
... def __getattr__(self, attr):
... if attr == '__copy__':
... print("Đang truy cập '__copy__'")
... nâng cao AttributionError
...
sau đó__sao chép__
Thuộc tính dường như không còn được truy cập:
>>> foo = Foo()
# Hành vi thực tế của bản sao(foo)
>>> sao chép(foo)
Traceback (most recent call last):
File "", line 1, in
Tệp "C:\ProgramData\Miniconda3\lib\copy.py", dòng 96, trong bản sao
rv = bộ giảm tốc(4)
TypeError: Đối tượng 'NoneType' không thể gọi được
# Hành vi dự kiến của bản sao(foo)
>>> foo.__copy__()
Đang truy cập '__copy__'
Traceback (most recent call last):
File "", line 1, in
Tệp "", dòng 5, trong __getattr__
Lỗi thuộc tính
tôi ở đây sao chép
Những chức năng nào còn thiếu trong quá trình thực hiện? __sao chép__
tài sản?
Theo tôi hiểu, đưa ra foo
Đối tượng không có thuộc tính thanh
, nó sẽ hoạt động giống hệt nhau cho dù nó có __getattr__
hiện hữu thanh
Phương pháp này không thành công hoặc không xác định được điều gì. Tuyên bố này có chính xác không?
Câu trả lời ngắn gọn có vẻ là "không".
hiện hữusao chép.copy
Trong phương pháp chúng tôi đã tìm thấy điều này (tóm tắt)
cls = loại(x)
...
máy photocopy = getattr(cls, "__copy__", Không có)
Chúng ta thấy rằng chức năng này là类上使用getattr
,而不是实例.
dangzai类kêu gọigetattr
không thể được gọi khi__getattr__
(Chỉ vì nó là một实例 phương pháp)
Bản demo (xin lỗi, tôi thích bản demo hoạt động hơn)
lớpFoo:
def __getattr__(self,attr):
nếu attr == '__copy__':
trả về "ĐÃ LÀM VIỆC"
foo = Foo()
print(getattr(foo, "__copy__",None))
print(getattr(Foo, "__copy__",None))
trở lại:
LÀM VIỆC
Không có
Vì vậy nếu bạn không tạo __sao chép__
phương pháp, không thể đánh lừa bản gốc sao chép.copy
mô-đun tin là tồn tại __sao chép__
tài sản.
Tôi là một lập trình viên xuất sắc, rất giỏi!