Bản thân có phải là một con trỏ trong python không?
Đây là phần thứ hai của loạt bài gồm ba phần đề cập đến các khía cạnh khác nhau của quản lý bộ nhớ Python. Nó bắt đầu cuộc sống như một cuộc nói chuyện hội nghị mà tôi đã thực hiện vào năm 2021, có tiêu đề 'Con trỏ? Show
Hãy xem Phần 1 của loạt bài này hoặc đọc tiếp phần thảo luận về bình đẳng trong Python và tại sao nó lại phức tạp hơn bạn nghĩ ID đối tượng và tại sao chúng lại quan trọngChúng ta đã kết thúc Phần 1 với câu hỏi sau. làm cách nào để biết khi nào hai đối tượng Python thực sự là cùng một đối tượng trong bộ nhớ? Vì vậy, làm thế nào để mỗi người trong số họ làm việc? Bộ so sánh >>> a = ["a", "list"] >>> id(a) 139865338256192 >>> b = a >>> id(a), id(b) (139865338256192, 139865338256192)5Một cách chúng ta có thể hỏi '_____08 và 9 có giống nhau không?' bằng Python là viết cái này
Điều này sẽ trả về cho chúng ta hoặc là 0 hoặc là 1 Nếu hai đối tượng thực sự là cùng một đối tượng trong bộ nhớ, thì 5 sẽ cho chúng ta biết điều đó. Một điều rất hữu ích có thể giúp chúng ta hiểu điều này và để thấy nó hoạt động, là xem xét 3 của một đối tượng trong PythonĐối tượng >>> c = a.copy() >>> id(a), id(c) (139865338256192, 139865337919872)3sPython có hàm 3 tích hợp với các thuộc tính sau
Có nhiều cách triển khai Python và trong khi ba điều trên phải đúng với hàm 3 trong mỗi cách triển khai, thì không phải tất cả chúng đều thực hiện theo cùng một cách. Một số triển khai, chẳng hạn như CPython (trình thông dịch python được viết bằng C), sử dụng địa chỉ bộ nhớ của đối tượng làm 3 của nó - nhưng đừng cho rằng tất cả các triển khai sẽVí dụ: một triển khai Python khác là Skulpt, trình biên dịch Python-to-JavaScript mà Anvil sử dụng để chạy mã máy khách Python trong trình duyệt (để bạn có thể phát triển web mà không cần phải viết JavaScript). Các đối tượng trong JavaScript không có địa chỉ bộ nhớ ổn định và JavaScript không hiển thị mã định danh ổn định cho mọi đối tượng. Vì vậy, Skulpt không thể sử dụng địa chỉ của đối tượng trong bộ nhớ làm 3 của nóĐối với phần còn lại của bài viết này, chúng tôi sẽ sử dụng các ví dụ được tạo bằng CPython, sử dụng địa chỉ bộ nhớ của đối tượng làm 3 của nó. CPython có thể làm điều này bởi vì, khi một đối tượng trong CPython tồn tại, nó không thể được di chuyển trong bộ nhớ. Điều đó có nghĩa là việc sử dụng địa chỉ của một đối tượng làm 3 của nó sẽ đảm bảo giá trị ổn định trong suốt thời gian tồn tại của đối tượng đó, không giống như (ví dụ) SkulptVì vậy, hãy xem điều gì sẽ xảy ra khi chúng ta kiểm tra 3 của một đối tượngDưới đây, chúng tôi xác định một danh sách 8 và tạo một con trỏ mới tới nó bằng cách đặt 70. Khi chúng tôi kiểm tra các 3 của chúng, chúng tôi có thể thấy rằng chúng giống nhau - 8 và 9 chỉ ra cùng một thứ
Thử điều tương tự với 74 cho thấy điều này tạo ra một đối tượng danh sách mới;
Vì vậy, bây giờ chúng ta đã hiểu về 3 của một đối tượng trong Python, chúng ta có thể thấy rằng bộ so sánh 5 thực sự rất đơn giản>>> a = ["a", "list"] >>> id(a) 139865338256192 >>> b = a >>> id(a), id(b) (139865338256192, 139865338256192)5 sử dụng >>> c = a.copy() >>> id(a), id(c) (139865338256192, 139865337919872)6Nói 12 tương đương trực tiếp với nói 13. Khi bạn gọi 5 trên hai đối tượng, Python sẽ lấy các 3 của chúng và so sánh trực tiếp chúng. Đó là nóTuy nhiên, đó không phải là kết thúc của câu chuyện; Bộ so sánh >>> a = ["a", "list"] >>> id(a) 139865338256192 >>> b = a >>> id(a), id(b) (139865338256192, 139865338256192)6Một cách khác để hỏi ' 8 và 9 có giống nhau không?' bằng Python là viết như sau 8Cũng giống như 5, điều này sẽ trả lại cho chúng tôi 0 hoặc 1. Nhưng cách Python quyết định cái nào sẽ trả về khác với toán tử 5 và điều này có nghĩa là 6 và 5 có thể cho chúng ta các kết quả khác nhau cho cùng một đối tượngĐể thấy điều này trong thực tế, hãy xem xét ví dụ quen thuộc của chúng ta, với 8 trỏ đến một danh sách đối tượng danh sách, 9 một con trỏ khác tới đối tượng đó và 76 một con trỏ tới một bản sao của đối tượng đó 7Với thiết lập này, chúng ta có thể thực hiện các phép so sánh sau và thấy rằng 98 là 0 trong khi 10 là 1 1Một lần nữa. chuyện gì đang xảy ra ở đây? . 5 dùng khi bạn muốn biết liệu hai con trỏ có đang trỏ vào cùng một đối tượng trong bộ nhớ hay không; >>> a = ["a", "list"] >>> id(a) 139865338256192 >>> b = a >>> id(a), id(b) (139865338256192, 139865338256192)5 sử dụng >>> c = a.copy() >>> id(a), id(c) (139865338256192, 139865337919872)6Câu trả lời là 5 và 6 được thiết kế để phục vụ hai mục đích khác nhau. 5 dùng khi bạn muốn biết liệu hai con trỏ có đang trỏ vào cùng một đối tượng trong bộ nhớ hay không; >>> a = ["a", "list"] >>> id(a) 139865338256192 >>> b = a >>> id(a), id(b) (139865338256192, 139865338256192)6 sử dụng >>> c = a.copy() >>> id(a), id(c) (139865338256192, 139865337919872)53Khi bạn viết 54, thực ra bạn đang gọi một phương thức ma thuật, còn được gọi là phương thức dunder (được đặt tên theo dấu gạch dưới kép ở mỗi bên). Bạn có thể đã quen thuộc với một số phương pháp ma thuật rồi, chẳng hạn như
Các phương thức ma thuật chỉ đơn giản là các phương thức trên một lớp Python và hai dấu gạch dưới cho biết rằng chúng tương tác với các hàm Python tích hợp. Ví dụ: ghi đè phương thức 56 trên một lớp Python sẽ thay đổi cách thức hoạt động của hàm 57 nếu bạn gọi nó trên một phiên bản của lớp đã sửa đổi đóKhi nói đến 6 và 53, dễ hiểu nhất với một số ví dụ. Hãy cùng xemGhi đè phương thức >>> c = a.copy() >>> id(a), id(c) (139865338256192, 139865337919872)53Dưới đây, chúng tôi định nghĩa một lớp với phương thức 53 của riêng nó. Mọi phương thức 53 đều có hai đối số. 08 - thể hiện của lớp được đề cập - và đối số thứ hai (trong đoạn mã bên dưới, chúng tôi gọi nó là 09) là bất kỳ đối tượng nào mà 08 đang được so sánh với 9Vì vậy, nếu chúng ta đánh giá như sau 1… thì điều này gọi phương thức 53 của MyClass, với 8 là tham số 08 và chuỗi 04 là tham số 09. Lưu ý rằng 09 không thực sự phải là một đối tượng cùng loại với 08. Bạn có thể chọn thực hiện kiểm tra phương pháp 53 của mình nếu muốn, nhưng nó không tự độngTrong ví dụ trên, 09 sử dụng bộ so sánh 5, tương đương với việc so sánh các 3 của từng đối tượng. Khi nó xảy ra, đây thực sự là hành vi mặc định cho bất kỳ lớp nào do người dùng định nghĩa trong PythonVì vậy, điều gì sẽ xảy ra nếu chúng ta xác định một số hành vi không mặc định? Dưới đây, chúng tôi định nghĩa một lớp nhận đối số 12 (sẽ giúp chúng tôi theo dõi các phiên bản của mình trong các ví dụ này) và có một phương thức 53 trả về một cách bừa bãi 0 5Bởi vì chúng tôi đã ghi đè phương thức 53 để luôn trả về 0, điều đó có nghĩa là tất cả các phiên bản của lớp này sẽ được coi là bằng nhau dưới bộ so sánh 6 - ngay cả khi tên của chúng có các giá trị khác nhau 0Hơn nữa, chúng ta cũng có thể thấy các trường hợp của 18 cư xử kỳ lạ khi so sánh với các đối tượng thuộc các loại khác nhau 0Khi so sánh một thể hiện của 18 với bất kỳ thứ gì - không chỉ các thể hiện của cùng một lớp - nó sẽ trả về 0. Điều này là do, như chúng tôi đã nói trước đó, theo mặc định, phương thức 53 không kiểm tra các loại đối tượng được so sánhVì vậy, chúng ta có thể làm cho các đối tượng tương đương với bất kỳ thứ gì bằng cách ghi đè 53. Chúng ta cũng có thể làm ngược lại 1Bạn có thể nghĩ rằng điều này là hợp lý hơn, nhưng hãy xem xét 2Hơn nữa, vì hành vi của 53 phụ thuộc vào đối tượng nào là 08 và đối tượng nào là 09, nên chúng ta có thể nhận được hành vi sau bằng cách sử dụng một phiên bản của 18 và một 27 3Điều này là do thứ tự mà chúng tôi so sánh các vấn đề của 28 và 29. Khi chúng tôi thực hiện 30, chúng tôi đang sử dụng phương thức 53 được xác định trong 18 - 28 là 08 và 29 là 09 và phương thức đó luôn trả về 0. Điều ngược lại là đúng khi chúng ta viết 38, vì vậy chúng ta nhận được giá trị 1 cho biểu thức đóTóm tắt. các phương pháp ma thuật là một cách thú vị để khiến Python làm những việc có vẻ rất kỳ lạ và bạn nên tự mày mò với rủi ro Vậy chúng ta đã học được những gì? . Chúng tôi cũng đã khám phá cách chúng tôi có thể ghi đè 53 để xác định ý tưởng tương đương của riêng mình và xem tại sao làm như vậy có thể dẫn đến một số hành vi kỳ lạTrước đó, chúng tôi đã đề cập rằng 6 là hằng số và duy nhất 'trong suốt thời gian tồn tại của 8', tương đương với câu nói 'miễn là 8 vẫn còn trong bộ nhớ'. Điều đó đặt ra câu hỏi. một khi chúng tôi đã tạo một đối tượng 8, làm thế nào và tại sao 'tuổi thọ' của nó kết thúc? Thông tin thêm về AnvilNếu bạn là người mới ở đây, xin chào mừng. Anvil là một nền tảng để xây dựng các ứng dụng web full-stack không có gì ngoài Python. Không cần phải vật lộn với JS, HTML, CSS, Python, SQL và tất cả các framework của chúng – chỉ cần xây dựng tất cả bằng Python thử cái đe Tìm hiểu thêmBắt đầu với AnvilSử dụng trình tạo ứng dụng kéo và thả của chúng tôi để tạo ứng dụng thu thập phản hồi và gửi cho bạn qua email, đồng thời xuất bản trực tuyến trong mười phút hoặc ít hơn. Đi Bảy cách để vẽ dữ liệu trong PythonPython là ngôn ngữ của Khoa học dữ liệu và có rất nhiều thư viện vẽ sơ đồ ngoài kia Bạn nên chọn cái nào? Trong hướng dẫn này, chúng tôi giới thiệu và giải thích các thư viện vẽ đồ thị Python nổi tiếng nhất, với một bài viết chi tiết về từng thư viện Đi Triển khai khoa học dữ liệu lên web với DeepnoteSử dụng Anvil để xây dựng giao diện người dùng cho sổ ghi chép Deepnote Đi Tạo hóa đơn PDF bằng PythonTrong bản dựng ví dụ này, hãy xem cách tạo và tải xuống hóa đơn PDF Đi Tạo mẫu nhanh. Xây dựng lịch trình trong 3 giờMất bao lâu để thử nghiệm một startup? Kiểu dữ liệu nào là self trong Python?Tham số self là tham chiếu đến phiên bản hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp.
Bản thân có được coi là một từ khóa trong Python không?Việc viết tham số này dưới dạng self chỉ là một quy ước. Đó không phải là từ khóa và không có ý nghĩa đặc biệt trong Python. Chúng tôi có thể sử dụng các tên khác (như thế này) nhưng rất không khuyến khích. Hầu hết các nhà phát triển đều phản đối việc sử dụng các tên khác với tên mình và làm giảm khả năng đọc của mã (Khả năng đọc được tính).
Con trỏ này trong C++ có giống với self trong Python không?Bản thân trong Python tương đương với con trỏ bản thân trong C++ và tham chiếu this trong Java và C#. Chắc hẳn bạn đang thắc mắc làm thế nào Python đưa ra giá trị cho self và tại sao bạn không cần đưa ra giá trị cho nó. Một ví dụ sẽ làm rõ điều này. |