cuốn sách gpt4 ai đã làm

python — Khi nào bản sao (foo) gọi foo.copy?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 14:46:21 33 4
mua khóa gpt4 Nike

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ốngFoolớp và sao chép một thể hiện của nó, sao chépHà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ếuFoolớ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à:

  1. Cố gắng truy cập vào đối tượng __sao chép__属性
  2. Nếu có thì gọi
  3. 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épchứ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 hay nhất

Câu trả lời ngắn gọn có vẻ là "không".

hiện hữusao chép.copyTrong 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,而不是实例.

dangzaikêu gọigetattrkhô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.

Về python - Khi nào copy(foo) gọi foo.copy? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/46217657/

33 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress