__ Setitem __ trong Python là gì?
Như bạn đã thấy trong phần trước, các phương thức thông thường sẽ đi một chặng đường dài hướng tới việc bao bọc một từ điển trong một lớp. Nhưng chỉ các phương thức bình thường thôi là chưa đủ, bởi vì có rất nhiều thứ bạn có thể làm với từ điển ngoài việc gọi các phương thức trên chúng. Đối với người mới bắt đầu, bạn có thể nhận và đặt các mục bằng cú pháp không bao gồm các phương thức gọi rõ ràng. Đây là nơi các phương thức lớp đặc biệt xuất hiện. họ cung cấp một cách để ánh xạ cú pháp không gọi phương thức thành các cuộc gọi phương thức Show
5. 6. 1. Nhận và cài đặt các mụcVí dụ 5. 12. Phương thức đặc biệt __getitem__def __getitem__(self, key): return self.data[key] >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3' Ví dụ 5. 13. Phương pháp đặc biệt __setitem__def __setitem__(self, key, item): self.data[key] = item >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32} Điều này trông giống như cú pháp từ điển thông thường, tất nhiên ngoại trừ f thực sự là một lớp đang cố gắng hết sức để giả mạo thành một từ điển và __setitem__ là một phần thiết yếu của sự giả mạo đó. Dòng mã này thực sự gọi f. __setitem__("genre", 32) dưới trang bìa __setitem__ là một phương thức lớp đặc biệt vì nó được gọi cho bạn, nhưng nó vẫn là một phương thức lớp. Cũng dễ dàng như phương thức __setitem__ đã được định nghĩa trong UserDict, bạn có thể định nghĩa lại nó trong lớp hậu duệ để ghi đè lên phương thức tổ tiên. Điều này cho phép bạn định nghĩa các lớp hoạt động giống như từ điển theo một số cách nhưng xác định hành vi của riêng chúng ở trên và ngoài từ điển tích hợp Khái niệm này là nền tảng của toàn bộ khuôn khổ mà bạn đang nghiên cứu trong chương này. Mỗi loại tệp có thể có một lớp trình xử lý biết cách lấy siêu dữ liệu từ một loại tệp cụ thể. Khi một số thuộc tính (như tên và vị trí của tệp) được biết, lớp xử lý sẽ biết cách tự động lấy các thuộc tính khác. Điều này được thực hiện bằng cách ghi đè phương thức __setitem__, kiểm tra các khóa cụ thể và thêm xử lý bổ sung khi chúng được tìm thấy Ví dụ: MP3FileInfo là hậu duệ của FileInfo. Khi tên của MP3FileInfo được đặt, nó không chỉ đặt khóa tên (giống như tổ tiên FileInfo đã làm); . Ví dụ tiếp theo cho thấy cách thức hoạt động của nó Ví dụ 5. 14. Ghi đè __setitem__ trong MP3FileInfodef __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item) Đây là mấu chốt của toàn bộ lớp MP3FileInfo. nếu bạn đang gán một giá trị cho khóa tên, bạn muốn làm thêm điều gì đó. Quá trình xử lý bổ sung mà bạn thực hiện đối với tên được gói gọn trong phương thức __parse. Đây là một phương thức lớp khác được định nghĩa trong MP3FileInfo và khi bạn gọi nó, bạn đủ điều kiện cho nó tự. Chỉ cần gọi __parse sẽ tìm kiếm một hàm bình thường được định nghĩa bên ngoài lớp, đây không phải là điều bạn muốn. tự gọi mình. __parse sẽ tìm một phương thức lớp được định nghĩa trong lớp. Đây không phải là điều gì mới mẻ; Khi truy cập các thuộc tính dữ liệu trong một lớp, bạn cần xác định tên thuộc tính. bản thân. thuộc tính. Khi gọi các phương thức khác trong một lớp, bạn cần xác định tên phương thức. bản thân. phương phápVí dụ 5. 15. Đặt tên của MP3FileInfo>>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'} Bây giờ niềm vui thực sự bắt đầu. Việc đặt khóa tên của tệp mp3file sẽ kích hoạt phương thức __setitem__ trên MP3FileInfo (không phải UserDict), phương thức này thông báo rằng bạn đang đặt khóa tên bằng một giá trị thực và tự gọi. __parse. Mặc dù bạn chưa theo dõi phương thức __parse, nhưng bạn có thể thấy từ đầu ra rằng nó đặt một số khóa khác. album, nghệ sĩ, thể loại, tiêu đề, năm và nhận xét Các đối tượng là sự trừu tượng hóa dữ liệu của Python. Tất cả dữ liệu trong chương trình Python được biểu diễn bằng đối tượng hoặc bằng quan hệ giữa các đối tượng. (Theo một nghĩa nào đó, và phù hợp với mô hình “máy tính chương trình được lưu trữ” của Von Neumann, mã cũng được biểu diễn bằng các đối tượng. ) Mỗi đối tượng có một danh tính, một loại và một giá trị. Danh tính của một đối tượng không bao giờ thay đổi khi nó đã được tạo; . Toán tử '______67' so sánh danh tính của hai đối tượng; Chi tiết triển khai CPython. Đối với CPython, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule9 là địa chỉ bộ nhớ lưu trữ class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass0 Loại đối tượng xác định các hoạt động mà đối tượng hỗ trợ (e. g. , "nó có độ dài không?") và cũng xác định các giá trị có thể có cho các đối tượng thuộc loại đó. Hàm class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass1 trả về kiểu của một đối tượng (chính nó là một đối tượng). Giống như danh tính của nó, loại đối tượng cũng không thể thay đổi. 1 Giá trị của một số đối tượng có thể thay đổi. Các đối tượng có giá trị có thể thay đổi được gọi là có thể thay đổi; . (Giá trị của một đối tượng vùng chứa bất biến có chứa tham chiếu đến một đối tượng có thể thay đổi có thể thay đổi khi giá trị của đối tượng sau này bị thay đổi; tuy nhiên, vùng chứa vẫn được coi là không thay đổi, bởi vì tập hợp các đối tượng mà nó chứa không thể thay đổi được. Vì vậy, tính bất biến không hoàn toàn giống với việc có một giá trị không thể thay đổi, nó tinh tế hơn. ) Khả năng thay đổi của một đối tượng được xác định bởi loại của nó; Các đối tượng không bao giờ bị phá hủy một cách rõ ràng; . Việc triển khai được phép hoãn việc thu thập rác hoặc bỏ qua hoàn toàn — đó là vấn đề về chất lượng triển khai, cách thức triển khai việc thu gom rác, miễn là không có đối tượng nào được thu thập mà vẫn có thể truy cập được Chi tiết triển khai CPython. CPython hiện đang sử dụng sơ đồ đếm tham chiếu với (tùy chọn) phát hiện chậm rác được liên kết theo chu kỳ, thu thập hầu hết các đối tượng ngay khi chúng không thể truy cập được, nhưng không được đảm bảo để thu thập rác chứa tham chiếu vòng tròn. Xem tài liệu của mô-đun class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass2 để biết thông tin về cách kiểm soát việc thu gom rác tuần hoàn. Các triển khai khác hoạt động khác và CPython có thể thay đổi. Không phụ thuộc vào việc hoàn thiện ngay lập tức các đối tượng khi chúng không thể truy cập được (vì vậy bạn phải luôn đóng tệp một cách rõ ràng) Lưu ý rằng việc sử dụng các phương tiện theo dõi hoặc gỡ lỗi của triển khai có thể giữ cho các đối tượng tồn tại mà thông thường có thể thu thập được. Cũng lưu ý rằng việc bắt một ngoại lệ bằng câu lệnh '_______93... class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass4' có thể giữ cho các đối tượng tồn tại Một số đối tượng chứa các tham chiếu đến tài nguyên “bên ngoài” chẳng hạn như tệp hoặc cửa sổ đang mở. Điều này được hiểu rằng các tài nguyên này được giải phóng khi đối tượng được thu gom rác, nhưng vì việc thu gom rác không được đảm bảo xảy ra, nên các đối tượng đó cũng cung cấp một cách rõ ràng để giải phóng tài nguyên bên ngoài, thường là phương thức class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass5. Các chương trình được khuyến khích mạnh mẽ để đóng các đối tượng như vậy một cách rõ ràng. Câu lệnh '_______93...____97' và câu lệnh ' class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass8' cung cấp các cách thuận tiện để thực hiện việc này Một số đối tượng chứa tham chiếu đến các đối tượng khác; . Ví dụ về vùng chứa là bộ dữ liệu, danh sách và từ điển. Các tham chiếu là một phần giá trị của vùng chứa. Trong hầu hết các trường hợp, khi chúng ta nói về giá trị của một vùng chứa, chúng ta ngụ ý các giá trị, không phải danh tính của các đối tượng được chứa; . Vì vậy, nếu một bộ chứa bất biến (như bộ dữ liệu) chứa tham chiếu đến một đối tượng có thể thay đổi, thì giá trị của nó sẽ thay đổi nếu đối tượng có thể thay đổi đó bị thay đổi Các loại ảnh hưởng đến hầu hết các khía cạnh của hành vi đối tượng. Ngay cả tầm quan trọng của danh tính đối tượng cũng bị ảnh hưởng theo một nghĩa nào đó. đối với các loại bất biến, các hoạt động tính toán các giá trị mới thực sự có thể trả về một tham chiếu đến bất kỳ đối tượng hiện có nào có cùng loại và giá trị, trong khi đối với các đối tượng có thể thay đổi thì điều này không được phép. e. g. , sau class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass9, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'90 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'91 có thể hoặc không tham chiếu đến cùng một đối tượng với giá trị một, tùy thuộc vào cách triển khai, nhưng sau >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'92, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'93 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'94 được đảm bảo tham chiếu đến hai danh sách trống khác nhau, duy nhất, mới được tạo. (Lưu ý rằng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'95 gán cùng một đối tượng cho cả >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'93 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'94. ) 3. 2. Hệ thống phân cấp loại tiêu chuẩn¶Dưới đây là danh sách các loại được tích hợp sẵn trong Python. Các mô-đun mở rộng (được viết bằng C, Java hoặc các ngôn ngữ khác, tùy thuộc vào việc triển khai) có thể xác định các loại bổ sung. Các phiên bản tương lai của Python có thể thêm các loại vào hệ thống phân cấp loại (e. g. , số hữu tỷ, mảng số nguyên được lưu trữ hiệu quả, v.v. ), mặc dù những phần bổ sung như vậy thường sẽ được cung cấp thông qua thư viện chuẩn để thay thế Một số mô tả loại bên dưới chứa đoạn liệt kê 'thuộc tính đặc biệt. ' Đây là những thuộc tính cung cấp quyền truy cập vào việc triển khai và không dành cho mục đích sử dụng chung. Định nghĩa của họ có thể thay đổi trong tương lai Không cóLoại này có một giá trị duy nhất. Có một đối tượng duy nhất với giá trị này. Đối tượng này được truy cập thông qua tên dựng sẵn >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98. Nó được sử dụng để biểu thị sự vắng mặt của một giá trị trong nhiều tình huống, e. g. , nó được trả về từ các hàm không trả về bất cứ thứ gì một cách rõ ràng. Giá trị thật của nó là saiKhông được thực hiện Loại này có một giá trị duy nhất. Có một đối tượng duy nhất với giá trị này. Đối tượng này được truy cập thông qua tên dựng sẵn >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99. Các phương thức số và các phương thức so sánh phong phú sẽ trả về giá trị này nếu chúng không thực hiện thao tác cho các toán hạng được cung cấp. (Trình thông dịch sau đó sẽ thử thao tác được phản ánh hoặc một số hoạt động dự phòng khác, tùy thuộc vào người vận hành. ) Nó không nên được đánh giá trong ngữ cảnh boolean Xem Thực hiện các phép toán số học để biết thêm chi tiết. Đã thay đổi trong phiên bản 3. 9. Đánh giá >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99 trong ngữ cảnh boolean không được dùng nữa. Mặc dù nó hiện được đánh giá là đúng, nhưng nó sẽ phát ra một >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}01. Nó sẽ tăng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 trong phiên bản tương lai của Python. dấu chấm lửng Loại này có một giá trị duy nhất. Có một đối tượng duy nhất với giá trị này. Đối tượng này được truy cập thông qua >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}03 theo nghĩa đen hoặc tên tích hợp sẵn >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}04. Giá trị thật của nó là true >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}05 Chúng được tạo bởi các chữ số và được trả về dưới dạng kết quả bởi các toán tử số học và các hàm tích hợp số học. Các đối tượng số là bất biến; . Tất nhiên, các số trong Python có liên quan chặt chẽ với các số toán học, nhưng chịu các hạn chế của biểu diễn số trong máy tính Biểu diễn chuỗi của các lớp số, được tính bởi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}06 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}07, có các thuộc tính sau
Python phân biệt giữa số nguyên, số dấu phẩy động và số phức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}08 Chúng đại diện cho các phần tử từ tập hợp các số nguyên (dương và âm) Có hai loại số nguyên Số nguyên (>>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}09) Chúng đại diện cho các số trong một phạm vi không giới hạn, chỉ tùy thuộc vào bộ nhớ (ảo) có sẵn. Với mục đích của các phép toán dịch chuyển và mặt nạ, một biểu diễn nhị phân được giả định và các số âm được biểu diễn dưới dạng một biến thể của phần bù 2, điều này tạo ảo giác về một chuỗi vô hạn các bit dấu kéo dài sang trái Booleans (>>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}90) Chúng đại diện cho các giá trị thật Sai và Đúng. Hai đối tượng đại diện cho các giá trị >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}91 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}92 là các đối tượng Boolean duy nhất. Kiểu Boolean là một kiểu con của kiểu số nguyên và các giá trị Boolean hoạt động giống như các giá trị 0 và 1 tương ứng trong hầu hết các ngữ cảnh, ngoại trừ khi được chuyển đổi thành một chuỗi, các chuỗi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}93 hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}94 được trả về tương ứng Các quy tắc biểu diễn số nguyên nhằm đưa ra cách giải thích có ý nghĩa nhất về phép dịch chuyển và mặt nạ liên quan đến số nguyên âm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}95 ( >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}96) Chúng đại diện cho các số dấu phẩy động chính xác kép ở cấp độ máy. Bạn phụ thuộc vào kiến trúc máy bên dưới (và triển khai C hoặc Java) cho phạm vi được chấp nhận và xử lý tràn. Python không hỗ trợ các số dấu phẩy động có độ chính xác đơn; >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}97 ( >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}98) Chúng biểu thị các số phức dưới dạng một cặp số dấu phẩy động chính xác kép ở cấp độ máy. Các cảnh báo tương tự áp dụng cho các số dấu phẩy động. Phần thực và phần ảo của một số phức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}99 có thể được truy xuất thông qua các thuộc tính chỉ đọc def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)90 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)91trình tự Chúng đại diện cho các tập hợp có thứ tự hữu hạn được lập chỉ mục bởi các số không âm. Hàm tích hợp def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)92 trả về số phần tử của một chuỗi. Khi độ dài của một dãy là n, bộ chỉ số chứa các số 0, 1, …, n-1. Mục i của dãy a được chọn bởi def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)93 Trình tự cũng hỗ trợ cắt. def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)94 chọn tất cả các mục có chỉ số k sao cho i def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)95 k def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)96 j. Khi được sử dụng như một biểu thức, một lát cắt là một chuỗi cùng loại. Điều này ngụ ý rằng bộ chỉ mục được đánh số lại để nó bắt đầu từ 0 Một số trình tự cũng hỗ trợ “cắt lát mở rộng” với tham số “bước” thứ ba. def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)97 chọn tất cả các mục của a có chỉ số x trong đó def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)98, n def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)99 >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}90 và i def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)95 x def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)96 j Các trình tự được phân biệt theo khả năng biến đổi của chúng Trình tự bất biếnMột đối tượng thuộc loại chuỗi bất biến không thể thay đổi sau khi được tạo. (Nếu đối tượng chứa các tham chiếu đến các đối tượng khác, các đối tượng khác này có thể thay đổi và có thể thay đổi; tuy nhiên, tập hợp các đối tượng được tham chiếu trực tiếp bởi một đối tượng không thể thay đổi không thể thay đổi. ) Các loại sau đây là trình tự bất biến DâyChuỗi là một chuỗi các giá trị đại diện cho các điểm mã Unicode. Tất cả các điểm mã trong phạm vi >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}93 có thể được biểu diễn trong một chuỗi. Python không có loại char ; . Hàm tích hợp sẵn >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}95 chuyển đổi một điểm mã từ dạng chuỗi của nó thành một số nguyên trong phạm vi >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}96; . Có thể sử dụng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule90 để chuyển đổi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule91 thành import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule92 bằng cách sử dụng mã hóa văn bản đã cho và có thể sử dụng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule93 để đạt được điều ngược lại. bộ dữ liệu Các mục của một tuple là các đối tượng Python tùy ý. Các bộ gồm hai mục trở lên được tạo bởi các danh sách biểu thức được phân tách bằng dấu phẩy. Một bộ của một mục (một 'singleton') có thể được tạo bằng cách thêm dấu phẩy vào một biểu thức (bản thân một biểu thức không tạo ra một bộ, vì dấu ngoặc đơn phải được sử dụng để nhóm các biểu thức). Một bộ trống có thể được tạo bởi một cặp dấu ngoặc đơn rỗng byteMột đối tượng bytes là một mảng bất biến. Các mục là các byte 8 bit, được biểu thị bằng các số nguyên trong phạm vi 0 <= x < 256. Các ký tự byte (như import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule94) và hàm tạo import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule95 tích hợp có thể được sử dụng để tạo các đối tượng byte. Ngoài ra, các đối tượng byte có thể được giải mã thành chuỗi thông qua phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule96trình tự có thể thay đổi Trình tự có thể thay đổi có thể được thay đổi sau khi chúng được tạo. Các ký hiệu đăng ký và cắt lát có thể được sử dụng làm mục tiêu của các câu lệnh gán và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule97 (xóa) Hiện tại có hai loại trình tự có thể thay đổi nội tại danh sáchCác mục của danh sách là các đối tượng Python tùy ý. Danh sách được hình thành bằng cách đặt một danh sách các biểu thức được phân tách bằng dấu phẩy trong dấu ngoặc vuông. (Lưu ý rằng không có trường hợp đặc biệt nào cần thiết để tạo danh sách có độ dài 0 hoặc 1. ) Mảng byteMột đối tượng bytearray là một mảng có thể thay đổi. Chúng được tạo bởi hàm dựng sẵn import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule98. Ngoài việc có thể thay đổi (và do đó không thể băm được), các mảng byte còn cung cấp giao diện và chức năng giống như các đối tượng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule92 bất biến Mô-đun mở rộng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule90 cung cấp một ví dụ bổ sung về loại trình tự có thể thay đổi, cũng như mô-đun import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule91Đặt loại Chúng đại diện cho các tập hợp hữu hạn, không có thứ tự của các đối tượng duy nhất, bất biến. Như vậy, chúng không thể được lập chỉ mục bởi bất kỳ chỉ số nào. Tuy nhiên, chúng có thể được lặp đi lặp lại và hàm tích hợp sẵn def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)92 trả về số lượng mục trong một tập hợp. Các cách sử dụng phổ biến cho các tập hợp là kiểm tra tư cách thành viên nhanh, loại bỏ các bản trùng lặp khỏi một chuỗi và tính toán các phép toán như giao, hợp, hiệu và hiệu đối xứng Đối với các phần tử tập hợp, các quy tắc bất biến tương tự áp dụng cho các khóa từ điển. Lưu ý rằng các loại số tuân theo các quy tắc thông thường để so sánh số. nếu hai số so sánh bằng nhau (e. g. , >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}94 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule94), chỉ một trong số chúng có thể được chứa trong một bộ Hiện tại có hai loại tập hợp nội tại bộChúng đại diện cho một tập hợp có thể thay đổi. Chúng được tạo bởi hàm tạo import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule95 tích hợp và có thể được sửa đổi sau đó bằng một số phương thức, chẳng hạn như import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule96bộ đông lạnh Chúng đại diện cho một tập hợp bất biến. Chúng được tạo bởi hàm dựng sẵn import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule97. Vì một bộ đóng băng là bất biến và có thể băm nên nó có thể được sử dụng lại như một phần tử của một bộ khác hoặc làm khóa từ điển. ánh xạ Chúng đại diện cho các bộ đối tượng hữu hạn được lập chỉ mục bởi các bộ chỉ mục tùy ý. Ký hiệu chỉ số dưới import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule98 chọn mục được lập chỉ mục bởi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule99 từ ánh xạ >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'90; . Hàm tích hợp sẵn def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)92 trả về số mục trong ánh xạ Hiện tại có một loại ánh xạ nội tại duy nhất từ điểnChúng đại diện cho các bộ đối tượng hữu hạn được lập chỉ mục bởi các giá trị gần như tùy ý. Các loại giá trị duy nhất không được chấp nhận làm khóa là các giá trị chứa danh sách hoặc từ điển hoặc các loại có thể thay đổi khác được so sánh theo giá trị thay vì theo danh tính đối tượng, lý do là việc triển khai từ điển hiệu quả yêu cầu giá trị băm của khóa không đổi. Các loại số được sử dụng cho các phím tuân theo các quy tắc thông thường để so sánh số. nếu hai số so sánh bằng nhau (e. g. , >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}94 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule94) thì chúng có thể được sử dụng thay thế cho nhau để lập chỉ mục cho cùng một mục từ điển Từ điển duy trì thứ tự chèn, nghĩa là các khóa sẽ được tạo theo cùng thứ tự mà chúng được thêm tuần tự vào từ điển. Thay thế một khóa hiện có không thay đổi thứ tự, tuy nhiên, xóa một khóa và cắm lại sẽ thêm khóa đó vào cuối thay vì giữ nguyên vị trí cũ Từ điển có thể thay đổi; . Dictionary displays). Các mô-đun mở rộng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule06 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule07 cung cấp các ví dụ bổ sung về các loại ánh xạ, cũng như mô-đun import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule91 Đã thay đổi trong phiên bản 3. 7. Từ điển không giữ nguyên thứ tự chèn trong các phiên bản Python trước 3. 6. Trong Trăn 3. 6, thứ tự chèn được giữ nguyên, nhưng nó được coi là chi tiết triển khai tại thời điểm đó hơn là đảm bảo ngôn ngữ. các loại có thể gọiĐây là những loại có thể áp dụng thao tác gọi hàm (xem phần Lệnh gọi ). Hàm do người dùng định nghĩaMột đối tượng hàm do người dùng xác định được tạo bởi một định nghĩa hàm (xem phần Định nghĩa hàm ). Nó nên được gọi với một danh sách đối số chứa cùng số mục như danh sách tham số chính thức của hàm. thuộc tính đặc biệt Thuộc tính Nghĩa import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule09 Chuỗi tài liệu của hàm hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu không có; Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule11 Tên chức năng Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule12 Tên đủ điều kiện qualified name của hàm. . Mới trong phiên bản 3. 3 Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule13 Tên của mô-đun mà chức năng đã được xác định trong hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu không có Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule15 Một bộ chứa các giá trị đối số mặc định cho những đối số có giá trị mặc định hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu không có đối số nào có giá trị mặc định Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule17 Đối tượng mã đại diện cho thân hàm đã biên dịch Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule18 Tham chiếu đến từ điển chứa các biến toàn cục của hàm — không gian tên toàn cục của mô-đun trong đó hàm được xác định Chỉ đọc import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 Không gian tên hỗ trợ các thuộc tính chức năng tùy ý Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule20 >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 hoặc một bộ ô chứa các liên kết cho các biến tự do của hàm. Xem bên dưới để biết thông tin về thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule22 Chỉ đọc import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule23 Một lệnh chứa chú thích của các tham số. Các khóa của dict là tên tham số và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule24 cho chú thích trả về, nếu được cung cấp. Để biết thêm thông tin về cách làm việc với thuộc tính này, hãy xem Các phương pháp hay nhất về chú thích . Có thể ghi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule25 Một lệnh chứa các giá trị mặc định cho các tham số chỉ từ khóa Có thể ghi Hầu hết các thuộc tính có nhãn “Writable” kiểm tra loại giá trị được gán Các đối tượng hàm cũng hỗ trợ nhận và đặt các thuộc tính tùy ý, chẳng hạn như có thể được sử dụng để đính kèm siêu dữ liệu vào các hàm. Ký hiệu dấu chấm thuộc tính thông thường được sử dụng để lấy và đặt các thuộc tính đó. Lưu ý rằng việc triển khai hiện tại chỉ hỗ trợ các thuộc tính chức năng trên các chức năng do người dùng xác định. Các thuộc tính chức năng trên các chức năng tích hợp có thể được hỗ trợ trong tương lai Một đối tượng ô có thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule22. Điều này có thể được sử dụng để lấy giá trị của ô, cũng như đặt giá trị Thông tin bổ sung về định nghĩa của hàm có thể được truy xuất từ đối tượng mã của nó; . Loại import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule27 có thể được truy cập trong mô-đun import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule28Phương thức sơ thẩm Một đối tượng phương thức thể hiện kết hợp một lớp, một thể hiện của lớp và bất kỳ đối tượng nào có thể gọi được (thông thường là một hàm do người dùng định nghĩa) Thuộc tính chỉ đọc đặc biệt. import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 là đối tượng thể hiện của lớp, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule30 là đối tượng hàm; Các phương thức cũng hỗ trợ truy cập (nhưng không cài đặt) các thuộc tính hàm tùy ý trên đối tượng hàm bên dưới Các đối tượng phương thức do người dùng định nghĩa có thể được tạo khi nhận một thuộc tính của một lớp (có thể thông qua một thể hiện của lớp đó), nếu thuộc tính đó là một đối tượng hàm do người dùng định nghĩa hoặc một đối tượng phương thức của lớp Khi một đối tượng phương thức thể hiện được tạo bằng cách truy xuất một đối tượng hàm do người dùng định nghĩa từ một lớp thông qua một trong các thể hiện của nó, thì thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 của nó là thể hiện và đối tượng phương thức được cho là bị ràng buộc. Thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule30 của phương thức mới là đối tượng hàm ban đầu Khi một đối tượng phương thức thể hiện được tạo bằng cách truy xuất một đối tượng phương thức lớp từ một lớp hoặc thể hiện, thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 của nó là chính lớp đó và thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule30 của nó là đối tượng hàm bên dưới phương thức lớp Khi một đối tượng phương thức thể hiện được gọi, hàm bên dưới ( import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule30) được gọi, chèn thể hiện của lớp ( import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29) trước danh sách đối số. Chẳng hạn, khi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule43 là một lớp chứa định nghĩa cho hàm import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule44 và class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass0 là một thể hiện của import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule43, việc gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule47 tương đương với việc gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule48 Khi một đối tượng phương thức thể hiện được bắt nguồn từ một đối tượng phương thức lớp, thì “thể hiện lớp” được lưu trữ trong import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 sẽ thực sự là chính lớp đó, do đó, việc gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule47 hoặc import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule51 tương đương với việc gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule52 trong đó import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule53 là hàm cơ bản Lưu ý rằng việc chuyển đổi từ đối tượng hàm sang đối tượng phương thức thể hiện xảy ra mỗi khi thuộc tính được truy xuất từ thể hiện. Trong một số trường hợp, cách tối ưu hiệu quả là gán thuộc tính cho một biến cục bộ và gọi biến cục bộ đó. Cũng lưu ý rằng việc chuyển đổi này chỉ xảy ra đối với các chức năng do người dùng xác định; . Cũng cần lưu ý rằng các hàm do người dùng định nghĩa là các thuộc tính của một thể hiện lớp không được chuyển đổi thành các phương thức ràng buộc; chức năng máy phát điệnHàm hoặc phương thức sử dụng câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule54 (xem phần Câu lệnh năng suất ) được gọi là hàm tạo. Một hàm như vậy, khi được gọi, luôn trả về một đối tượng iterator có thể được sử dụng để thực thi phần thân của hàm. gọi phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule55 của iterator sẽ khiến hàm thực thi cho đến khi nó cung cấp một giá trị bằng cách sử dụng câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule54. Khi hàm thực thi một câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule57 hoặc rơi ra khỏi phần cuối, một ngoại lệ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule58 sẽ được đưa ra và trình vòng lặp sẽ kết thúc tập hợp các giá trị được trả về. chức năng quy trình Một hàm hoặc phương thức được định nghĩa bằng cách sử dụng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule59 được gọi là hàm coroutine. Một hàm như vậy, khi được gọi, sẽ trả về một đối tượng coroutine . Nó có thể chứa các biểu thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule60, cũng như các câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule61 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule62. Xem thêm phần Đối tượng Coroutine . Chức năng máy phát điện không đồng bộ Một hàm hoặc phương thức được xác định bằng cách sử dụng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule59 và sử dụng câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule54 được gọi là hàm tạo không đồng bộ. Một hàm như vậy, khi được gọi, sẽ trả về một đối tượng trình lặp không đồng bộ có thể được sử dụng trong câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule62 để thực thi phần thân của hàm. Gọi phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule66 của trình lặp không đồng bộ sẽ trả về một awaitable mà khi được đợi sẽ thực thi cho đến khi nó cung cấp một giá trị bằng cách sử dụng biểu thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule54. Khi hàm thực thi một câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule57 trống hoặc rơi ra khỏi phần cuối, một ngoại lệ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule69 được đưa ra và trình vòng lặp không đồng bộ sẽ đạt đến phần cuối của tập hợp các giá trị được tạo ra. Chức năng tích hợp sẵn Một đối tượng chức năng tích hợp là một trình bao bọc xung quanh một chức năng C. Ví dụ về các chức năng tích hợp sẵn là def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)92 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule71 ( import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule72 là một mô-đun tích hợp tiêu chuẩn). Số lượng và loại đối số được xác định bởi hàm C. Thuộc tính chỉ đọc đặc biệt. import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule09 là chuỗi tài liệu của hàm hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu không có; Các phương pháp tích hợp Đây thực sự là một cách ngụy trang khác của một hàm dựng sẵn, lần này chứa một đối tượng được truyền cho hàm C dưới dạng một đối số phụ ngầm định. Một ví dụ về phương thức dựng sẵn là import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule80, giả sử alist là một đối tượng danh sách. Trong trường hợp này, thuộc tính chỉ đọc đặc biệt import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 được đặt thành đối tượng được biểu thị bằng alistCác lớp học Các lớp có thể gọi được. Các đối tượng này thường đóng vai trò là nhà máy cho các phiên bản mới của chính chúng, nhưng các biến thể có thể xảy ra đối với các loại lớp ghi đè lên import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82. Các đối số của cuộc gọi được chuyển đến import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 và, trong trường hợp điển hình, đến import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84 để khởi tạo phiên bản mớiTrường hợp lớp Có thể gọi các thể hiện của các lớp tùy ý bằng cách định nghĩa một phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule85 trong lớp của chúngmô-đun Mô-đun là đơn vị tổ chức cơ bản của mã Python và được tạo bởi hệ thống nhập như được gọi bởi câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule86 hoặc bởi . Một đối tượng mô-đun có một không gian tên được triển khai bởi một đối tượng từ điển (đây là từ điển được tham chiếu bởi thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule18 của các hàm được xác định trong mô-đun). Tham chiếu thuộc tính được dịch sang tra cứu trong từ điển này, e. g. , import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule90 tương đương với import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule91. Đối tượng mô-đun không chứa đối tượng mã được sử dụng để khởi tạo mô-đun (vì nó không cần thiết sau khi quá trình khởi tạo hoàn tất). Gán thuộc tính cập nhật từ điển không gian tên của mô-đun, e. g. , import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule92 tương đương với import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule93 Thuộc tính được xác định trước (có thể ghi) import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule11 Thuộc tính chỉ đọc đặc biệt. import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 là không gian tên của mô-đun dưới dạng đối tượng từ điển Chi tiết triển khai CPython. Do cách CPython xóa từ điển mô-đun, từ điển mô-đun sẽ bị xóa khi mô-đun nằm ngoài phạm vi ngay cả khi từ điển vẫn có tham chiếu trực tiếp. Để tránh điều này, hãy sao chép từ điển hoặc giữ nguyên mô-đun trong khi sử dụng trực tiếp từ điển của nó lớp tùy chỉnhCác loại lớp tùy chỉnh thường được tạo theo định nghĩa lớp (xem phần Định nghĩa lớp ). Một lớp có một không gian tên được triển khai bởi một đối tượng từ điển. Tham chiếu thuộc tính lớp được dịch sang tra cứu trong từ điển này, e. g. , class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass02 được dịch thành class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass03 (mặc dù có một số hook cho phép các phương tiện định vị thuộc tính khác). Khi không tìm thấy tên thuộc tính ở đó, việc tìm kiếm thuộc tính tiếp tục trong các lớp cơ sở. Tìm kiếm các lớp cơ sở này sử dụng thứ tự phân giải phương thức C3 hoạt động chính xác ngay cả khi có cấu trúc thừa kế 'kim cương' nơi có nhiều đường dẫn thừa kế dẫn trở lại tổ tiên chung. Chi tiết bổ sung về C3 MRO được sử dụng bởi Python có thể được tìm thấy trong tài liệu đi kèm với 2. 3 phát hành tại https. //www. con trăn. org/tải xuống/phát hành/2. 3/mro/. Khi một tham chiếu thuộc tính lớp (đối với lớp import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule43 chẳng hạn) sẽ tạo ra một đối tượng phương thức lớp, thì nó được chuyển đổi thành một đối tượng phương thức thể hiện có thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 là import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule43. Khi nó tạo ra một đối tượng phương thức tĩnh, nó được chuyển đổi thành đối tượng được bao bọc bởi đối tượng phương thức tĩnh. Xem phần Triển khai Bộ mô tả để biết một cách khác mà các thuộc tính được truy xuất từ một lớp có thể khác với các thuộc tính thực sự có trong lớp import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 của nó. Các phép gán thuộc tính lớp cập nhật từ điển của lớp, không bao giờ là từ điển của lớp cơ sở Một đối tượng lớp có thể được gọi (xem ở trên) để tạo ra một thể hiện của lớp (xem bên dưới) thuộc tính đặc biệt thể hiện lớpimport sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule11 Một thể hiện của lớp được tạo bằng cách gọi một đối tượng của lớp (xem bên trên). Một thể hiện của lớp có một không gian tên được triển khai dưới dạng từ điển, đây là nơi đầu tiên mà các tham chiếu thuộc tính được tìm kiếm. Khi một thuộc tính không được tìm thấy ở đó và lớp của đối tượng có một thuộc tính theo tên đó, quá trình tìm kiếm sẽ tiếp tục với các thuộc tính của lớp. Nếu một thuộc tính lớp được tìm thấy là một đối tượng hàm do người dùng định nghĩa, nó sẽ được chuyển đổi thành một đối tượng phương thức thể hiện có thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule29 là thể hiện. Các đối tượng phương thức tĩnh và phương thức lớp cũng được chuyển đổi; . Xem phần Triển khai Bộ mô tả để biết một cách khác trong đó các thuộc tính của một lớp được truy xuất thông qua các thể hiện của nó có thể khác với các đối tượng thực sự được lưu trữ trong import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 của lớp đó. Nếu không tìm thấy thuộc tính lớp nào và lớp của đối tượng có phương thức class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass18, thì phương thức đó được gọi để đáp ứng tra cứu. Việc gán và xóa thuộc tính cập nhật từ điển của cá thể, không bao giờ là từ điển của lớp. Nếu lớp có phương thức class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass19 hoặc class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass20, thì phương thức này được gọi thay vì cập nhật trực tiếp từ điển cá thể Các thể hiện của lớp có thể giả vờ là các số, trình tự hoặc ánh xạ nếu chúng có các phương thức với các tên đặc biệt nhất định. Xem phần Tên phương thức đặc biệt . thuộc tính đặc biệt. import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 là từ điển thuộc tính; Đối tượng I/O (còn được gọi là đối tượng tệp) A đối tượng tệp đại diện cho một tệp đang mở. Nhiều phím tắt có sẵn để tạo các đối tượng tệp. chức năng tích hợp sẵn của class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass23, cũng như phương thức class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass24, class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass25 và class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass26 của các đối tượng ổ cắm (và có lẽ bởi các chức năng hoặc phương thức khác được cung cấp bởi các mô-đun mở rộng). Các đối tượng class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass27, class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass28 và class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass29 được khởi tạo để tạo các đối tượng tệp tương ứng với các luồng đầu vào, đầu ra và lỗi tiêu chuẩn của trình thông dịch; các loại nội bộ Một vài loại được trình thông dịch sử dụng nội bộ được hiển thị cho người dùng. Định nghĩa của chúng có thể thay đổi với các phiên bản tương lai của trình thông dịch, nhưng chúng được đề cập ở đây cho đầy đủ đối tượng mãCác đối tượng mã đại diện cho mã Python thực thi được biên dịch theo byte hoặc mã byte . Sự khác biệt giữa đối tượng mã và đối tượng hàm là đối tượng hàm chứa tham chiếu rõ ràng đến toàn cục của hàm (mô-đun trong đó nó được xác định), trong khi đối tượng mã không chứa ngữ cảnh; . Không giống như các đối tượng chức năng, các đối tượng mã là bất biến và không chứa tham chiếu (trực tiếp hoặc gián tiếp) đến các đối tượng có thể thay đổi. Thuộc tính chỉ đọc đặc biệt. class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass31 đưa ra tên chức năng; Các bit cờ sau đây được xác định cho class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass47. bit class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass49 được đặt nếu hàm sử dụng cú pháp class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass50 để chấp nhận số lượng đối số vị trí tùy ý; Các khai báo tính năng trong tương lai ( class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass54) cũng sử dụng các bit trong class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass47 để cho biết liệu một đối tượng mã có được biên dịch với một tính năng cụ thể được bật hay không. bit class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass56 được đặt nếu chức năng được biên dịch với phép chia trong tương lai được kích hoạt; Các bit khác trong class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass47 được dành riêng cho mục đích sử dụng nội bộ Nếu một đối tượng mã đại diện cho một chức năng, mục đầu tiên trong class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass41 là chuỗi tài liệu của chức năng hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu không xác địnhđối tượng mã. co_positions() ¶ Trả về một lần lặp qua các vị trí mã nguồn của mỗi lệnh mã byte trong đối tượng mã Trình vòng lặp trả về các bộ chứa class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass62. Bộ thứ i tương ứng với vị trí của mã nguồn được biên dịch theo lệnh thứ i. Thông tin cột là độ lệch byte utf-8 được lập chỉ mục 0 trên dòng nguồn đã cho Thông tin vị trí này có thể bị thiếu. Danh sách không đầy đủ các trường hợp điều này có thể xảy ra
Khi điều này xảy ra, một số hoặc tất cả các phần tử của bộ dữ liệu có thể là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 Mới trong phiên bản 3. 11 Ghi chú Tính năng này yêu cầu lưu trữ các vị trí cột trong các đối tượng mã, điều này có thể dẫn đến việc tăng nhẹ mức sử dụng đĩa của các tệp Python đã biên dịch hoặc mức sử dụng bộ nhớ trình thông dịch. Để tránh lưu trữ thông tin bổ sung và/hoặc hủy kích hoạt in thông tin truy nguyên bổ sung, có thể sử dụng cờ dòng lệnh class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass63 class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass64 hoặc biến môi trường class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass70Đối tượng khung Các đối tượng khung đại diện cho các khung thực thi. Chúng có thể xảy ra trong các đối tượng theo dõi (xem bên dưới) và cũng được chuyển đến các chức năng theo dõi đã đăng ký Thuộc tính chỉ đọc đặc biệt. class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass71 là khung ngăn xếp trước đó (về phía người gọi) hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu đây là khung ngăn xếp dưới cùng; Truy cập vào class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass73 làm phát sinh sự kiện kiểm tra class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass79 với các đối số class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass80 và class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass81. Thuộc tính có thể ghi đặc biệt. class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass82, nếu không phải là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98, là một hàm được gọi cho các sự kiện khác nhau trong quá trình thực thi mã (hàm này được trình gỡ lỗi sử dụng). Thông thường, một sự kiện được kích hoạt cho mỗi dòng nguồn mới - điều này có thể bị vô hiệu hóa bằng cách đặt class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass84 thành >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}91 Việc triển khai có thể cho phép yêu cầu các sự kiện trên mỗi opcode bằng cách đặt class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass86 thành >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}92. Lưu ý rằng điều này có thể dẫn đến hành vi trình thông dịch không xác định nếu các ngoại lệ do hàm theo dõi đưa ra thoát đến hàm đang được theo dõi class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass88 là số dòng hiện tại của khung — ghi vào dòng này từ bên trong hàm theo dõi nhảy đến dòng đã cho (chỉ dành cho khung dưới cùng). Trình gỡ lỗi có thể triển khai lệnh Nhảy (còn gọi là Đặt câu lệnh tiếp theo) bằng cách ghi vào f_lineno Các đối tượng khung hỗ trợ một phương thức khung hình. xóa() ¶Phương pháp này xóa tất cả các tham chiếu đến các biến cục bộ được giữ bởi khung. Ngoài ra, nếu khung thuộc về trình tạo, trình tạo được hoàn thành. Điều này giúp phá vỡ các chu kỳ tham chiếu liên quan đến các đối tượng khung (ví dụ: khi bắt một ngoại lệ và lưu trữ dấu vết của nó để sử dụng sau này) class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass89 được nâng lên nếu khung hiện đang được thực thi Mới trong phiên bản 3. 4 đối tượng truy nguyênCác đối tượng truy nguyên đại diện cho một dấu vết ngăn xếp của một ngoại lệ. Một đối tượng truy nguyên được tạo hoàn toàn khi xảy ra ngoại lệ và cũng có thể được tạo rõ ràng bằng cách gọi class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass90 Đối với các truy nguyên được tạo hoàn toàn, khi tìm kiếm một trình xử lý ngoại lệ sẽ giải phóng ngăn xếp thực thi, tại mỗi cấp độ chưa được kết nối, một đối tượng truy ngược được chèn vào trước truy nguyên hiện tại. Khi một trình xử lý ngoại lệ được nhập, dấu vết ngăn xếp sẽ được cung cấp cho chương trình. (Xem phần Câu lệnh thử . ) Nó có thể truy cập dưới dạng mục thứ ba của bộ được trả về bởi class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass91 và là thuộc tính class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass92 của ngoại lệ bị bắt. Khi chương trình không chứa trình xử lý phù hợp, dấu vết ngăn xếp được ghi (được định dạng độc đáo) vào luồng lỗi tiêu chuẩn; Đối với các dấu vết được tạo rõ ràng, người tạo dấu vết phải xác định cách liên kết các thuộc tính class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass94 để tạo thành một dấu vết ngăn xếp đầy đủ Thuộc tính chỉ đọc đặc biệt. class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass95 điểm đến khung thực thi của cấp độ hiện tại; . Số dòng và lệnh cuối cùng trong truy nguyên có thể khác với số dòng của đối tượng khung của nó nếu ngoại lệ xảy ra trong câu lệnh class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass3 không có mệnh đề ngoại trừ phù hợp hoặc với mệnh đề cuối cùng Truy cập vào class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass95 làm phát sinh sự kiện kiểm tra class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass79 với các đối số class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass80 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'902. Thuộc tính có thể ghi đặc biệt. class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass94 là cấp độ tiếp theo trong dấu vết ngăn xếp (đối với khung nơi xảy ra ngoại lệ) hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu không có cấp độ tiếp theo Đã thay đổi trong phiên bản 3. 7. Các đối tượng truy nguyên hiện có thể được khởi tạo rõ ràng từ mã Python và thuộc tính class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass94 của các phiên bản hiện có có thể được cập nhật. Cắt đối tượng Các đối tượng lát cắt được sử dụng để biểu diễn các lát cắt cho các phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906. Chúng cũng được tạo bởi hàm >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'907 tích hợp Thuộc tính chỉ đọc đặc biệt. >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'908 là giới hạn dưới; . Các thuộc tính này có thể có bất kỳ kiểu nào Các đối tượng lát hỗ trợ một phương thức lát. chỉ số(bản thân , độ dài)¶Phương thức này lấy một đối số số nguyên có độ dài duy nhất và tính toán thông tin về lát cắt mà đối tượng lát cắt sẽ mô tả nếu được áp dụng cho một chuỗi các mục có độ dài. Nó trả về một bộ ba số nguyên; . Các chỉ số bị thiếu hoặc nằm ngoài giới hạn được xử lý theo cách nhất quán với các lát cắt thông thường Đối tượng phương thức tĩnhCác đối tượng phương thức tĩnh cung cấp một cách đánh bại việc chuyển đổi các đối tượng chức năng thành các đối tượng phương thức được mô tả ở trên. Đối tượng phương thức tĩnh là một trình bao bọc xung quanh bất kỳ đối tượng nào khác, thường là đối tượng phương thức do người dùng định nghĩa. Khi một đối tượng phương thức tĩnh được truy xuất từ một lớp hoặc một thể hiện của lớp, đối tượng thực sự được trả về là đối tượng được bao bọc, không chịu bất kỳ chuyển đổi nào nữa. Các đối tượng phương thức tĩnh cũng có thể gọi được. Các đối tượng phương thức tĩnh được tạo bởi hàm tạo >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'912 tích hợpĐối tượng phương thức lớp Một đối tượng phương thức lớp, giống như một đối tượng phương thức tĩnh, là một trình bao bọc xung quanh một đối tượng khác làm thay đổi cách truy xuất đối tượng đó từ các lớp và các thể hiện của lớp. Hành vi của các đối tượng phương thức lớp khi truy xuất như vậy được mô tả ở trên, trong phần "Phương thức do người dùng định nghĩa". Các đối tượng phương thức lớp được tạo bởi hàm tạo >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'913 tích hợp 3. 3. Tên phương thức đặc biệt¶Một lớp có thể thực hiện một số thao tác được gọi theo cú pháp đặc biệt (chẳng hạn như các phép toán số học hoặc đăng ký và cắt lớp) bằng cách định nghĩa các phương thức có tên đặc biệt. Đây là cách tiếp cận của Python để nạp chồng toán tử, cho phép các lớp xác định hành vi của chính chúng đối với các toán tử ngôn ngữ. Chẳng hạn, nếu một lớp định nghĩa một phương thức có tên là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906 và class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass0 là một thể hiện của lớp này, thì >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'916 gần tương đương với >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'917. Trừ khi được đề cập, các nỗ lực thực hiện một thao tác sẽ tạo ra một ngoại lệ khi không có phương thức thích hợp nào được xác định (thường là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918 hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02) Đặt một phương pháp đặc biệt thành >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 cho biết rằng thao tác tương ứng không khả dụng. Ví dụ: nếu một lớp đặt >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'921 thành >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98, thì lớp đó không thể lặp lại, do đó, việc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'923 trên các phiên bản của nó sẽ tăng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 (không quay lại >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906). 2 Khi triển khai một lớp mô phỏng bất kỳ loại dựng sẵn nào, điều quan trọng là việc mô phỏng chỉ được triển khai ở mức độ phù hợp với đối tượng được mô hình hóa. Ví dụ: một số trình tự có thể hoạt động tốt với việc truy xuất các phần tử riêng lẻ, nhưng việc trích xuất một lát cắt có thể không có ý nghĩa. (Một ví dụ về điều này là giao diện >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'926 trong Mô hình Đối tượng Tài liệu của W3C. ) 3. 3. 1. Tùy chỉnh cơ bản¶đối tượng. __new__(cls[ , . ...]) ¶Được gọi để tạo một thể hiện mới của lớp cls. import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 là một phương thức tĩnh (có trường hợp đặc biệt nên bạn không cần khai báo nó như vậy) lấy lớp mà một thể hiện được yêu cầu làm đối số đầu tiên của nó. Các đối số còn lại là những đối số được truyền cho biểu thức hàm tạo đối tượng (lệnh gọi đến lớp). Giá trị trả về của import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 phải là phiên bản đối tượng mới (thường là phiên bản của cls) Các triển khai điển hình tạo một thể hiện mới của lớp bằng cách gọi phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 của lớp cha sử dụng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'930 với các đối số thích hợp và sau đó sửa đổi thể hiện mới được tạo nếu cần trước khi trả lại nó Nếu import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 được gọi trong quá trình xây dựng đối tượng và nó trả về một thể hiện của cls, thì phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84 của thể hiện mới sẽ được gọi như >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'933, trong đó self là thể hiện mới và các đối số còn lại giống như được truyền cho hàm tạo đối tượng Nếu import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 không trả về một thể hiện của cls, thì phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84 của thể hiện mới sẽ không được gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 chủ yếu nhằm mục đích cho phép các lớp con thuộc loại bất biến (như int, str hoặc tuple) tùy chỉnh việc tạo cá thể. Nó cũng thường được ghi đè trong siêu dữ liệu tùy chỉnh để tùy chỉnh việc tạo lớpđối tượng. __init__(bản thân[ , . ...]) ¶ Được gọi sau khi phiên bản đã được tạo (bởi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82), nhưng trước khi nó được trả lại cho người gọi. Các đối số là những đối số được truyền cho biểu thức hàm tạo của lớp. Nếu một lớp cơ sở có một phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84, thì phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84 của lớp dẫn xuất, nếu có, phải gọi nó một cách rõ ràng để đảm bảo khởi tạo đúng phần lớp cơ sở của thể hiện; . >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'940 Bởi vì import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84 làm việc cùng nhau trong việc xây dựng các đối tượng ( import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule82 để tạo nó, và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84 để tùy chỉnh nó), nên không có giá trị nào không phải >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 có thể được trả về bởi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule84; đối tượng. __del__(bản thân) ¶ Được gọi khi instance sắp bị hủy. Đây còn được gọi là bộ hoàn thiện hoặc (không chính xác) là bộ hủy. Nếu một lớp cơ sở có một phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'948, thì phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'948 của lớp dẫn xuất, nếu có, phải gọi nó một cách rõ ràng để đảm bảo việc xóa đúng phần lớp cơ sở của thể hiện Không đảm bảo rằng các phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'948 được gọi cho các đối tượng vẫn tồn tại khi trình thông dịch thoát Ghi chú >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'953 không gọi trực tiếp >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'954 - cái trước giảm số tham chiếu cho class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass0 xuống một và cái sau chỉ được gọi khi số tham chiếu của class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass0 bằng 0 Chi tiết triển khai CPython. Có thể cho một chu kỳ tham chiếu để ngăn số lượng tham chiếu của một đối tượng về 0. Trong trường hợp này, chu kỳ sẽ được phát hiện và xóa sau đó bởi bộ thu gom rác theo chu kỳ . Một nguyên nhân phổ biến của các chu kỳ tham chiếu là khi một ngoại lệ bị bắt trong một biến cục bộ. Sau đó, các cục bộ của khung tham chiếu ngoại lệ, ngoại lệ này tham chiếu truy nguyên của chính nó, ngoại lệ này tham chiếu các cục bộ của tất cả các khung được bắt trong truy nguyên. Xem thêm Tài liệu cho mô-đun class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass2 Cảnh báo Do các trường hợp bấp bênh mà các phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'948 được gọi, các ngoại lệ xảy ra trong quá trình thực thi chúng sẽ bị bỏ qua và thay vào đó, một cảnh báo được in tới class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass29. Đặc biệt
Được gọi bởi hàm tích hợp >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'966 để tính toán biểu diễn chuỗi "chính thức" của một đối tượng. Nếu có thể, đây sẽ giống như một biểu thức Python hợp lệ có thể được sử dụng để tạo lại một đối tượng có cùng giá trị (với môi trường thích hợp). Nếu điều này là không thể, một chuỗi có dạng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'967 phải được trả lại. Giá trị trả về phải là một đối tượng chuỗi. Nếu một lớp định nghĩa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}06 nhưng không phải là >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}07, thì >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}06 cũng được sử dụng khi biểu diễn chuỗi "không chính thức" của các thể hiện của lớp đó được yêu cầu Điều này thường được sử dụng để gỡ lỗi, vì vậy điều quan trọng là biểu diễn phải giàu thông tin và rõ ràng đối tượng. __str__(bản thân) ¶Được gọi bởi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'971 và các hàm tích hợp sẵn >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'972 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'973 để tính toán biểu diễn chuỗi "không chính thức" hoặc có thể in được của một đối tượng. Giá trị trả về phải là một đối tượng chuỗi . Phương thức này khác với >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'974 ở chỗ không có kỳ vọng rằng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}07 sẽ trả về một biểu thức Python hợp lệ. một đại diện thuận tiện hơn hoặc ngắn gọn có thể được sử dụng Việc triển khai mặc định được xác định bởi loại dựng sẵn >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'976 gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'974đối tượng. __bytes__(bản thân) ¶ Được gọi bởi byte để tính toán biểu diễn chuỗi byte của một đối tượng. Điều này sẽ trả về một đối tượng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule92. đối tượng. __format__(bản thân , format_spec)¶ Được gọi bởi hàm dựng sẵn >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'972 và bằng cách mở rộng, đánh giá các chuỗi ký tự được định dạng và phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'980, để tạo ra “ . Đối số format_spec là một chuỗi chứa mô tả về các tùy chọn định dạng mong muốn. Việc giải thích đối số format_spec tùy thuộc vào loại triển khai >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'981, tuy nhiên, hầu hết các lớp sẽ ủy quyền định dạng cho một trong các loại tích hợp sẵn hoặc sử dụng cú pháp tùy chọn định dạng tương tự. Xem Ngôn ngữ nhỏ đặc tả định dạng để biết mô tả về cú pháp định dạng chuẩn. Giá trị trả về phải là một đối tượng chuỗi Đã thay đổi trong phiên bản 3. 4. Phương thức __format__ của >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'976 tự nó tăng một giá trị >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 nếu truyền bất kỳ chuỗi không trống nào. Đã thay đổi trong phiên bản 3. 7. ______1984 bây giờ tương đương với >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'985 thay vì >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'986. đối tượng. __lt__(bản thân , khác . )¶object.__le__(bản thân , khác . )¶object.__eq__(bản thân , khác . )¶object.__ne__(bản thân , khác . )¶object.__gt__(bản thân , khác . )¶object.__ge__(bản thân , khác)¶ Đây là những phương pháp được gọi là “so sánh phong phú”. Sự tương ứng giữa các ký hiệu toán tử và tên phương thức như sau. >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'987 cuộc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'988, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'989 cuộc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'990, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'991 cuộc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'992, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'993 cuộc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'994, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'995 cuộc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'996 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'997 cuộc gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'998 Một phương thức so sánh phong phú có thể trả về đơn lẻ >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99 nếu nó không thực hiện thao tác cho một cặp đối số đã cho. Theo quy ước, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}91 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}92 được trả về để so sánh thành công. Tuy nhiên, các phương thức này có thể trả về bất kỳ giá trị nào, vì vậy nếu toán tử so sánh được sử dụng trong ngữ cảnh Boolean (e. g. , trong điều kiện của câu lệnh >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}002), Python sẽ gọi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}003 trên giá trị để xác định xem kết quả là đúng hay sai Theo mặc định, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'976 triển khai >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 bằng cách sử dụng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule7, trả về >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99 trong trường hợp so sánh sai. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}008. Đối với >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}009, theo mặc định, nó ủy quyền cho >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 và đảo ngược kết quả trừ khi nó là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99. Không có mối quan hệ ngụ ý nào khác giữa các toán tử so sánh hoặc triển khai mặc định; . Để tự động tạo các hoạt động đặt hàng từ một hoạt động gốc, hãy xem >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}014 Xem đoạn trên >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 để biết một số lưu ý quan trọng về việc tạo các đối tượng có thể băm hỗ trợ các thao tác so sánh tùy chỉnh và có thể sử dụng làm khóa từ điển. Không có phiên bản đối số hoán đổi của các phương thức này (được sử dụng khi đối số bên trái không hỗ trợ thao tác nhưng đối số bên phải thì hỗ trợ); . Nếu các toán hạng có kiểu khác nhau và kiểu của toán hạng bên phải là lớp con trực tiếp hoặc gián tiếp của kiểu toán hạng bên trái, thì phương thức được phản ánh của toán hạng bên phải sẽ được ưu tiên, nếu không thì phương thức của toán hạng bên trái sẽ được ưu tiên. Phân lớp ảo không được xem xét đối tượng. __hash__(bản thân) ¶Được gọi bởi hàm tích hợp >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}022 và cho các hoạt động trên các thành viên của bộ sưu tập được băm bao gồm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}023, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}024 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}025. Phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 sẽ trả về một số nguyên. Thuộc tính bắt buộc duy nhất là các đối tượng so sánh bằng nhau có cùng giá trị băm; . Thí dụ def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)16 Ghi chú >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}022 cắt bớt giá trị được trả về từ phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 tùy chỉnh của một đối tượng thành kích thước của một >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}029. Đây thường là 8 byte trên bản dựng 64 bit và 4 byte trên bản dựng 32 bit. Nếu >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 của một đối tượng phải tương tác trên các bản dựng có kích thước bit khác nhau, hãy đảm bảo kiểm tra chiều rộng trên tất cả các bản dựng được hỗ trợ. Một cách dễ dàng để làm điều này là với >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}031 Nếu một lớp không định nghĩa một phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 thì nó cũng không nên định nghĩa một hoạt động >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015; . Nếu một lớp định nghĩa các đối tượng có thể thay đổi và triển khai phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005, thì lớp đó không nên triển khai >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015, vì việc triển khai các bộ sưu tập có thể băm yêu cầu giá trị băm của khóa là bất biến (nếu giá trị băm của đối tượng thay đổi, nó sẽ nằm trong nhóm băm sai) Các lớp do người dùng định nghĩa có các phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 theo mặc định; Một lớp ghi đè >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 và không định nghĩa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 sẽ có _____3015 được đặt ngầm định thành ____198. Khi phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 của một lớp là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98, các thể hiện của lớp sẽ tăng một giá trị >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 thích hợp khi một chương trình cố gắng truy xuất giá trị băm của chúng và cũng sẽ được xác định chính xác là không thể băm được khi kiểm tra >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}051 Nếu một lớp ghi đè >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 cần giữ lại việc triển khai >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 từ lớp cha, trình thông dịch phải được thông báo điều này một cách rõ ràng bằng cách đặt >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}054 Nếu một lớp không ghi đè >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}005 muốn chặn hỗ trợ băm, thì lớp đó nên bao gồm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}056 trong định nghĩa lớp. Một lớp xác định >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 của riêng nó mà tăng một cách rõ ràng một >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 sẽ được xác định không chính xác là có thể băm bởi một cuộc gọi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}051 Ghi chú Theo mặc định, các giá trị >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 của các đối tượng str và bytes được "muối" với một giá trị ngẫu nhiên không thể đoán trước. Mặc dù chúng không đổi trong một quy trình Python riêng lẻ, nhưng chúng không thể dự đoán được giữa các lần gọi Python lặp đi lặp lại Điều này nhằm cung cấp khả năng bảo vệ chống lại tấn công từ chối dịch vụ gây ra bởi các đầu vào được lựa chọn cẩn thận nhằm khai thác hiệu suất trong trường hợp xấu nhất của thao tác chèn chính tả, độ phức tạp O(n2). xem http. //www. chứng chỉ. org/advisory/ocert-2011-003. html để biết chi tiết Thay đổi giá trị băm ảnh hưởng đến thứ tự lặp lại của các tập hợp. Python chưa bao giờ đảm bảo về thứ tự này (và nó thường khác nhau giữa các bản dựng 32 bit và 64 bit) Xem thêm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}061 Đã thay đổi trong phiên bản 3. 3. Băm ngẫu nhiên được bật theo mặc định. đối tượng. __bool__(bản thân) ¶Được gọi để thực hiện kiểm tra giá trị thực và hoạt động tích hợp sẵn >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}003; . Khi phương thức này không được xác định, thì >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}065 được gọi, nếu nó được xác định và đối tượng được coi là đúng nếu kết quả của nó khác không. Nếu một lớp không định nghĩa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}065 hay >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}067, thì tất cả các thể hiện của nó được coi là đúng 3. 3. 2. Tùy chỉnh quyền truy cập thuộc tính¶Các phương thức sau đây có thể được định nghĩa để tùy chỉnh ý nghĩa của quyền truy cập thuộc tính (sử dụng, gán hoặc xóa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}068) cho các thể hiện của lớpđối tượng. __getattr__(bản thân , tên)¶ Được gọi khi truy cập thuộc tính mặc định không thành công với >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918 (hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}070 tăng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918 vì tên không phải là thuộc tính thể hiện hoặc thuộc tính trong cây lớp cho >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}072; hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073 của thuộc tính tên tăng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918). Phương thức này sẽ trả về giá trị thuộc tính (đã tính) hoặc tăng ngoại lệ >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918 Lưu ý rằng nếu thuộc tính được tìm thấy thông qua cơ chế bình thường, thì class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass18 không được gọi. (Đây là sự bất đối xứng có chủ ý giữa class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass18 và class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass19. ) Điều này được thực hiện vì lý do hiệu quả và vì nếu không thì class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass18 sẽ không có cách nào để truy cập các thuộc tính khác của thể hiện. Lưu ý rằng ít nhất đối với các biến mẫu, bạn có thể giả mạo toàn quyền kiểm soát bằng cách không chèn bất kỳ giá trị nào vào từ điển thuộc tính mẫu (mà thay vào đó chèn chúng vào một đối tượng khác). Xem phương pháp >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}070 bên dưới để biết cách thực sự có toàn quyền kiểm soát đối với quyền truy cập thuộc tínhđối tượng. __getattribute__(bản thân , tên)¶ Được gọi vô điều kiện để thực hiện truy cập thuộc tính cho các thể hiện của lớp. Nếu lớp cũng định nghĩa class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass18, thì lớp sau sẽ không được gọi trừ khi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}070 gọi nó một cách rõ ràng hoặc tăng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918. Phương thức này sẽ trả về giá trị thuộc tính (đã tính) hoặc tăng ngoại lệ >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918. Để tránh đệ quy vô hạn trong phương thức này, việc triển khai nó phải luôn gọi phương thức lớp cơ sở có cùng tên để truy cập bất kỳ thuộc tính nào mà nó cần, ví dụ: >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}085 Ghi chú Phương thức này vẫn có thể bị bỏ qua khi tra cứu các phương thức đặc biệt do lời gọi ngầm thông qua cú pháp ngôn ngữ hoặc các hàm tích hợp. Xem Tra cứu phương thức đặc biệt . Đối với các quyền truy cập thuộc tính nhạy cảm nhất định, hãy tăng sự kiện kiểm tra class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass79 với các đối số class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass80 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}088. đối tượng. __setattr__(bản thân , tên, value)¶ Được gọi khi thử gán thuộc tính. Điều này được gọi thay vì cơ chế bình thường (i. e. lưu trữ giá trị trong từ điển cá thể). name là tên thuộc tính, value là giá trị được gán cho nó Nếu class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass19 muốn gán cho một thuộc tính thể hiện, nó sẽ gọi phương thức của lớp cơ sở có cùng tên, ví dụ: >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}090 Đối với các phép gán thuộc tính nhạy cảm nhất định, hãy tăng sự kiện kiểm tra >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}091 với các đối số class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass80, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}088, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}094. đối tượng. __delattr__(bản thân , tên)¶ Giống như class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass19 nhưng để xóa thuộc tính thay vì gán. Điều này chỉ nên được thực hiện nếu >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}096 có ý nghĩa đối với đối tượng Đối với một số thao tác xóa thuộc tính nhạy cảm, hãy tăng sự kiện kiểm tra >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}097 với các đối số class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass80 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}088. đối tượng. __dir__(bản thân) ¶ Được gọi khi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}900 được gọi trên đối tượng. Một chuỗi phải được trả lại. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}900 chuyển đổi chuỗi trả về thành danh sách và sắp xếp nó 3. 3. 2. 1. Tùy chỉnh quyền truy cập thuộc tính mô-đun¶Tên đặc biệt >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}902 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}903 cũng có thể được sử dụng để tùy chỉnh quyền truy cập vào các thuộc tính mô-đun. Hàm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}902 ở cấp độ mô-đun phải chấp nhận một đối số là tên của một thuộc tính và trả về giá trị được tính toán hoặc tăng một giá trị >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918. Nếu một thuộc tính không được tìm thấy trên một đối tượng mô-đun thông qua tra cứu thông thường, tôi. e. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}906, sau đó tìm kiếm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}902 trong mô-đun import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 trước khi tăng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918. Nếu tìm thấy, nó được gọi với tên thuộc tính và kết quả được trả về Hàm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}903 không được chấp nhận đối số và trả về một chuỗi chuỗi đại diện cho các tên có thể truy cập trên mô-đun. Nếu có, chức năng này sẽ ghi đè tìm kiếm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}900 tiêu chuẩn trên một mô-đun Để tùy chỉnh chi tiết hơn về hành vi của mô-đun (đặt thuộc tính, thuộc tính, v.v. ), người ta có thể đặt thuộc tính class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 của một đối tượng mô-đun thành một lớp con của >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}913. Ví dụ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule Ghi chú Việc xác định mô-đun >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}902 và đặt mô-đun class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 chỉ ảnh hưởng đến các tra cứu được thực hiện bằng cú pháp truy cập thuộc tính – truy cập trực tiếp vào toàn cầu của mô-đun (cho dù bằng mã trong mô-đun hoặc thông qua tham chiếu đến từ điển toàn cục của mô-đun) đều không bị ảnh hưởng Đã thay đổi trong phiên bản 3. 5. _______ Thuộc tính mô-đun 922 hiện có thể ghi. Mới trong phiên bản 3. 7. ______3902 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}903 thuộc tính mô-đun. Xem thêm PEP 562 - Mô-đun __getattr__ và __dir__Mô tả các chức năng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}902 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}903 trên các mô-đun 3. 3. 2. 2. Mô tả triển khai¶Các phương thức sau chỉ áp dụng khi một thể hiện của lớp chứa phương thức (cái gọi là lớp mô tả) xuất hiện trong lớp chủ sở hữu (bộ mô tả phải nằm trong từ điển lớp của chủ sở hữu hoặc trong từ điển lớp của một trong các lớp cha của nó). Trong các ví dụ bên dưới, “thuộc tính” đề cập đến thuộc tính có tên là khóa của thuộc tính trong lớp chủ sở hữu’ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19đối tượng. __get__(bản thân , thể hiện, owner=None)¶ Được gọi để lấy thuộc tính của lớp chủ sở hữu (truy cập thuộc tính lớp) hoặc của một thể hiện của lớp đó (truy cập thuộc tính thể hiện). Đối số chủ sở hữu tùy chọn là lớp chủ sở hữu, trong khi thể hiện là phiên bản mà thuộc tính được truy cập thông qua hoặc >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 khi thuộc tính được truy cập thông qua chủ sở hữu Phương thức này sẽ trả về giá trị thuộc tính được tính toán hoặc tăng ngoại lệ >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'918 PEP 252 chỉ định rằng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073 có thể gọi được với một hoặc hai đối số. Các bộ mô tả tích hợp sẵn của Python hỗ trợ thông số kỹ thuật này; . Việc triển khai >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}070 của riêng Python luôn chuyển vào cả hai đối số cho dù chúng có bắt buộc hay khôngđối tượng. __set__(bản thân , thể hiện, value)¶ Được gọi để đặt thuộc tính trên một thể hiện của lớp chủ sở hữu thành một giá trị mới, giá trị Lưu ý, việc thêm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}926 hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}927 sẽ thay đổi loại bộ mô tả thành “bộ mô tả dữ liệu”. Xem Gọi Trình mô tả để biết thêm chi tiết. đối tượng. __delete__(bản thân , thể hiện)¶ Được gọi để xóa thuộc tính trên một thể hiện của lớp chủ sở hữu Thuộc tính >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}928 được mô-đun >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}929 hiểu là chỉ định lớp nơi đối tượng này được xác định (việc đặt thuộc tính này một cách thích hợp có thể hỗ trợ trong thời gian chạy nội quan của các thuộc tính lớp động). Đối với các hàm có thể gọi được, nó có thể chỉ ra rằng một thể hiện của loại đã cho (hoặc một lớp con) được mong đợi hoặc được yêu cầu làm đối số vị trí đầu tiên (ví dụ: CPython đặt thuộc tính này cho các phương thức không liên kết được triển khai trong C) 3. 3. 2. 3. Gọi bộ mô tả¶Nói chung, một bộ mô tả là một thuộc tính đối tượng có "hành vi ràng buộc", một thuộc tính có quyền truy cập thuộc tính đã bị các phương thức trong giao thức mô tả ghi đè. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}926 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}927. Nếu bất kỳ phương thức nào trong số đó được xác định cho một đối tượng, thì nó được gọi là một bộ mô tả Hành vi mặc định để truy cập thuộc tính là lấy, đặt hoặc xóa thuộc tính khỏi từ điển của đối tượng. Chẳng hạn, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}933 có chuỗi tra cứu bắt đầu bằng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}934, sau đó là >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}935 và tiếp tục thông qua các lớp cơ sở của >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}936 ngoại trừ siêu dữ liệu Tuy nhiên, nếu giá trị tra cứu là một đối tượng xác định một trong các phương thức mô tả, thì Python có thể ghi đè hành vi mặc định và gọi phương thức mô tả thay thế. Điều này xảy ra ở đâu trong chuỗi ưu tiên phụ thuộc vào phương pháp mô tả nào được xác định và cách chúng được gọi Điểm bắt đầu cho lời gọi bộ mô tả là một ràng buộc, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}933. Làm thế nào các đối số được lắp ráp phụ thuộc vào >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'90Gọi trực tiếp Cuộc gọi đơn giản nhất và ít phổ biến nhất là khi mã người dùng gọi trực tiếp một phương thức mô tả. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}939Ràng buộc sơ thẩm Nếu liên kết với một thể hiện đối tượng, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}933 được chuyển thành cuộc gọi. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}941Ràng buộc lớp Nếu liên kết với một lớp, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}942 được chuyển thành cuộc gọi. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}943siêu ràng buộc Một tra cứu chấm, chẳng hạn như >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}944 tìm kiếm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}945 cho một lớp cơ sở >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}946 theo sau >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}947 và sau đó trả về >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}948. Nếu không phải là một mô tả, class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass0 được trả về không thay đổi Đối với các liên kết thể hiện, mức độ ưu tiên của lời gọi bộ mô tả phụ thuộc vào phương thức mô tả nào được xác định. Một bộ mô tả có thể xác định bất kỳ sự kết hợp nào của >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}926 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}927. Nếu nó không định nghĩa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073, thì việc truy cập thuộc tính sẽ trả về chính đối tượng mô tả trừ khi có một giá trị trong từ điển thể hiện của đối tượng. Nếu bộ mô tả xác định >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}926 và/hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}927, thì đó là bộ mô tả dữ liệu; . Thông thường, bộ mô tả dữ liệu xác định cả >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}926, trong khi bộ mô tả phi dữ liệu chỉ có phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073. Bộ mô tả dữ liệu có định nghĩa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}073 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}926 (và/hoặc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}927) luôn ghi đè định nghĩa lại trong từ điển mẫu. Ngược lại, các bộ mô tả phi dữ liệu có thể bị ghi đè bởi các trường hợp Các phương thức Python (bao gồm cả những phương thức được trang trí bằng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}962 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}963) được triển khai dưới dạng bộ mô tả phi dữ liệu. Theo đó, các thể hiện có thể xác định lại và ghi đè các phương thức. Điều này cho phép các phiên bản riêng lẻ có được các hành vi khác với các phiên bản khác của cùng một lớp Hàm >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}964 được triển khai dưới dạng bộ mô tả dữ liệu. Theo đó, các trường hợp không thể ghi đè hành vi của một thuộc tính 3. 3. 2. 4. __slots__¶__slots__ cho phép chúng tôi khai báo rõ ràng các thành viên dữ liệu (như thuộc tính) và từ chối việc tạo import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 và __weakref__ (trừ khi được khai báo rõ ràng trong __slots__ hoặc có sẵn trong cha mẹ. ) Không gian tiết kiệm được khi sử dụng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 có thể là đáng kể. Tốc độ tra cứu thuộc tính cũng có thể được cải thiện đáng kểđối tượng. __slots__ ¶ Biến lớp này có thể được gán một chuỗi, có thể lặp lại hoặc chuỗi các chuỗi có tên biến được sử dụng bởi các thể hiện. __slots__ dành chỗ cho các biến đã khai báo và ngăn việc tạo tự động import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 và __weakref__ cho mỗi trường hợp 3. 3. 2. 4. 1. Lưu ý khi sử dụng __slots__¶
3. 3. 3. Tùy chỉnh việc tạo lớp¶Bất cứ khi nào một lớp kế thừa từ một lớp khác, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}983 được gọi trên lớp cha. Bằng cách này, có thể viết các lớp thay đổi hành vi của các lớp con. Điều này liên quan chặt chẽ đến các bộ trang trí lớp, nhưng trong đó các bộ trang trí lớp chỉ ảnh hưởng đến lớp cụ thể mà chúng được áp dụng, thì >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}984 chỉ áp dụng cho các lớp con trong tương lai của lớp xác định phương thứcphương thức lớp đối tượng. __init_subclass__(cls) ¶ Phương thức này được gọi bất cứ khi nào lớp chứa được phân lớp. cls sau đó là phân lớp mới. Nếu được định nghĩa là một phương thức thể hiện bình thường, phương thức này được chuyển đổi hoàn toàn thành một phương thức lớp Các đối số từ khóa được cấp cho một lớp mới được chuyển đến lớp của cha mẹ >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}984. Để tương thích với các lớp khác bằng cách sử dụng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}984, người ta nên loại bỏ các đối số từ khóa cần thiết và chuyển các đối số khác sang lớp cơ sở, như trong class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass Việc triển khai mặc định >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}987 không làm gì cả, nhưng sẽ phát sinh lỗi nếu nó được gọi với bất kỳ đối số nào Ghi chú Gợi ý siêu dữ liệu >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}988 được sử dụng bởi phần còn lại của máy loại và không bao giờ được chuyển sang triển khai >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}984. Siêu dữ liệu thực tế (chứ không phải gợi ý rõ ràng) có thể được truy cập dưới dạng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}990 Mới trong phiên bản 3. 6 Khi một lớp được tạo, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}991 quét các biến của lớp và thực hiện gọi lại những biến có móc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}992đối tượng. __set_name__(bản thân , chủ sở hữu, name)¶ Được gọi tự động tại thời điểm chủ sở hữu lớp sở hữu được tạo. Đối tượng đã được gán tên trong lớp đó >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'9 Nếu biến lớp được gán sau khi lớp được tạo, thì >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}992 sẽ không được gọi tự động. Nếu cần, có thể gọi trực tiếp cho >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}992 >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}0 Xem Tạo đối tượng lớp để biết thêm chi tiết. Mới trong phiên bản 3. 6 3. 3. 3. 1. Siêu dữ liệu¶Theo mặc định, các lớp được xây dựng bằng cách sử dụng class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass1. Nội dung lớp được thực thi trong một không gian tên mới và tên lớp được liên kết cục bộ với kết quả của >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}996 Quá trình tạo lớp có thể được tùy chỉnh bằng cách chuyển đối số từ khóa >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}988 trong dòng định nghĩa lớp hoặc bằng cách kế thừa từ một lớp hiện có bao gồm đối số đó. Trong ví dụ sau, cả >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}998 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}999 đều là phiên bản của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)900 >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}9 Bất kỳ đối số từ khóa nào khác được chỉ định trong định nghĩa lớp đều được chuyển qua tất cả các thao tác siêu dữ liệu được mô tả bên dưới Khi một định nghĩa lớp được thực thi, các bước sau sẽ xảy ra
3. 3. 3. 2. Giải quyết các mục MRO¶Nếu một cơ sở xuất hiện trong định nghĩa lớp không phải là một thể hiện của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)901, thì một phương thức def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)902 sẽ được tìm kiếm trên đó. Nếu tìm thấy, nó được gọi với bộ cơ sở ban đầu. Phương thức này phải trả về một bộ các lớp sẽ được sử dụng thay vì cơ sở này. Bộ dữ liệu có thể trống, trong trường hợp đó, cơ sở ban đầu bị bỏ qua Xem thêm PEP 560 - Hỗ trợ cốt lõi để nhập mô-đun và các loại chung 3. 3. 3. 3. Xác định siêu dữ liệu phù hợp¶Siêu dữ liệu thích hợp cho định nghĩa lớp được xác định như sau
Siêu dữ liệu dẫn xuất nhất được chọn từ siêu dữ liệu được chỉ định rõ ràng (nếu có) và siêu dữ liệu (i. e. >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}990) của tất cả các lớp cơ sở được chỉ định. Siêu dữ liệu có nguồn gốc nhất là siêu dữ liệu là một kiểu con của tất cả các siêu dữ liệu ứng cử viên này. Nếu không có siêu dữ liệu ứng cử viên nào đáp ứng tiêu chí đó, thì định nghĩa lớp sẽ thất bại với >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 3. 3. 3. 4. Chuẩn bị không gian tên lớp¶Khi siêu dữ liệu thích hợp đã được xác định, thì không gian tên lớp được chuẩn bị. Nếu siêu dữ liệu có thuộc tính def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)908, thì nó được gọi là def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)909 (trong đó các đối số từ khóa bổ sung, nếu có, đến từ định nghĩa lớp). Phương pháp def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)908 nên được thực hiện như một def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)911. Không gian tên được trả về bởi def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)908 được chuyển vào def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)913, nhưng khi đối tượng lớp cuối cùng được tạo, không gian tên được sao chép vào một >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}025 mới Nếu siêu dữ liệu không có thuộc tính def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)908, thì không gian tên lớp được khởi tạo dưới dạng ánh xạ có thứ tự trống Xem thêm PEP 3115 - Siêu dữ liệu trong Python 3000Giới thiệu móc không gian tên def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)908 3. 3. 3. 5. Thực thi nội dung lớp¶Phần thân của lớp được thực thi (xấp xỉ) dưới dạng def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)917. Điểm khác biệt chính so với lệnh gọi thông thường tới def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)918 là phạm vi từ vựng cho phép phần thân lớp (bao gồm bất kỳ phương thức nào) tham chiếu tên từ phạm vi hiện tại và phạm vi bên ngoài khi định nghĩa lớp xảy ra bên trong một hàm Tuy nhiên, ngay cả khi định nghĩa lớp xảy ra bên trong hàm, các phương thức được định nghĩa bên trong lớp vẫn không thể nhìn thấy tên được xác định ở phạm vi lớp. Các biến lớp phải được truy cập thông qua tham số đầu tiên của các phương thức lớp hoặc thể hiện hoặc thông qua tham chiếu class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 có phạm vi từ vựng ngầm định được mô tả trong phần tiếp theo 3. 3. 3. 6. Tạo đối tượng lớp¶Khi không gian tên lớp đã được điền bằng cách thực thi phần thân lớp, đối tượng lớp được tạo bằng cách gọi def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)920 (các từ khóa bổ sung được chuyển vào đây giống như các từ khóa được chuyển tới def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)908) Đối tượng lớp này là đối tượng sẽ được tham chiếu bởi dạng không đối số của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)922. class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 là một tham chiếu đóng ngầm định được tạo bởi trình biên dịch nếu bất kỳ phương thức nào trong thân lớp tham chiếu đến hoặc là class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 hoặc là def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)925. Điều này cho phép dạng đối số 0 của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)922 xác định chính xác lớp được xác định dựa trên phạm vi từ vựng, trong khi lớp hoặc cá thể được sử dụng để thực hiện lệnh gọi hiện tại được xác định dựa trên đối số đầu tiên được truyền cho phương thức Chi tiết triển khai CPython. Trong Trăn 3. 6 trở lên, ô class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 được chuyển đến siêu dữ liệu dưới dạng mục nhập def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)928 trong không gian tên lớp. Nếu có, điều này phải được lan truyền tới cuộc gọi def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)929 để lớp được khởi tạo chính xác. Không làm như vậy sẽ dẫn đến class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass89 trong Python 3. 8 Khi sử dụng siêu dữ liệu mặc định def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)901 hoặc bất kỳ siêu dữ liệu nào cuối cùng gọi là def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)929, các bước tùy chỉnh bổ sung sau đây sẽ được gọi sau khi tạo đối tượng lớp
Sau khi đối tượng lớp được tạo, nó được chuyển đến các trình trang trí lớp có trong định nghĩa lớp (nếu có) và đối tượng kết quả được liên kết trong không gian tên cục bộ dưới dạng lớp đã xác định Khi một lớp mới được tạo bởi def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)929, đối tượng được cung cấp làm tham số không gian tên được sao chép sang ánh xạ có thứ tự mới và đối tượng ban đầu bị loại bỏ. Bản sao mới được bọc trong một proxy chỉ đọc, trở thành thuộc tính import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule19 của đối tượng lớp Xem thêm PEP 3135 - Siêu phẩm mớiMô tả tham chiếu đóng class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass22 ngầm định 3. 3. 3. 7. Sử dụng cho siêu dữ liệu¶Việc sử dụng tiềm năng cho siêu dữ liệu là vô tận. Một số ý tưởng đã được khám phá bao gồm enum, ghi nhật ký, kiểm tra giao diện, ủy quyền tự động, tạo thuộc tính tự động, proxy, khung và khóa/đồng bộ hóa tài nguyên tự động 3. 3. 4. Tùy chỉnh kiểm tra phiên bản và lớp con¶Các phương thức sau đây được sử dụng để ghi đè hành vi mặc định của các hàm tích hợp sẵn def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)940 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)941 Cụ thể, siêu dữ liệu def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)942 triển khai các phương thức này để cho phép bổ sung các Lớp cơ sở trừu tượng (ABC) dưới dạng “các lớp cơ sở ảo” cho bất kỳ lớp hoặc loại nào (bao gồm cả các loại tích hợp sẵn), bao gồm cả các ABC kháclớp. __instancecheck__(self , instance)¶ Trả về true nếu thể hiện nên được coi là thể hiện (trực tiếp hoặc gián tiếp) của lớp. Nếu được xác định, được gọi để thực hiện def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)943lớp. __kiểm tra phân lớp__(bản thân , phân lớp)¶ Trả về true nếu lớp con nên được coi là lớp con (trực tiếp hoặc gián tiếp) của lớp. Nếu được xác định, được gọi để thực hiện def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)944 Lưu ý rằng các phương thức này được tra cứu trên loại (siêu dữ liệu) của một lớp. Chúng không thể được định nghĩa là phương thức lớp trong lớp thực tế. Điều này phù hợp với việc tra cứu các phương thức đặc biệt được gọi trên các cá thể, chỉ trong trường hợp này, cá thể đó chính là một lớp Xem thêm PEP 3119 - Giới thiệu các lớp cơ sở trừu tượngBao gồm thông số kỹ thuật để tùy chỉnh hành vi của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)940 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)941 cho đến def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)947 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)948, với động lực cho chức năng này trong ngữ cảnh thêm Lớp cơ sở trừu tượng (xem mô-đun def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)949) vào ngôn ngữ 3. 3. 5. Mô phỏng các loại chung¶Khi sử dụng chú thích loại , việc tham số hóa loại chung using Python’s square-brackets notation. For example, the annotation def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)950 might be used to signify a def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)951 in which all the elements are of type >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}09. Xem thêm PEP 484 - Gợi ý loạiGiới thiệu khung của Python cho các chú thích loại Các loại bí danh chungTài liệu cho các đối tượng đại diện cho các lớp chung được tham số hóa Thuốc chung , Thuốc chung do người dùng định nghĩa vàdef __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)953 Tài liệu về cách triển khai các lớp chung có thể được tham số hóa trong thời gian chạy và được hiểu bởi trình kiểm tra kiểu tĩnh Một lớp nói chung chỉ có thể được tham số hóa nếu nó định nghĩa phương thức lớp đặc biệt def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954phương thức lớp đối tượng. __class_getitem__(cls , key)¶ Trả về một đối tượng đại diện cho chuyên môn hóa của một lớp chung bằng các đối số loại được tìm thấy trong khóa Khi được định nghĩa trên một lớp, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 sẽ tự động là một phương thức của lớp. Như vậy, nó không cần phải được trang trí bằng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}963 khi nó được định nghĩa 3. 3. 5. 1. Mục đích của __class_getitem__¶Mục đích của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 là cho phép tham số hóa thời gian chạy của các lớp chung trong thư viện tiêu chuẩn để dễ dàng áp dụng gợi ý loại cho các lớp này. Để triển khai các lớp chung tùy chỉnh có thể được tham số hóa trong thời gian chạy và được hiểu bởi trình kiểm tra kiểu tĩnh, người dùng nên kế thừa từ một lớp thư viện tiêu chuẩn đã triển khai def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 hoặc kế thừa từ def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)953, lớp có triển khai riêng của nó là def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 Việc triển khai tùy chỉnh của def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 trên các lớp được xác định bên ngoài thư viện chuẩn có thể không được hiểu bởi trình kiểm tra loại của bên thứ ba, chẳng hạn như mypy. Không khuyến khích sử dụng def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 trên bất kỳ lớp nào cho các mục đích khác ngoài gợi ý loại 3. 3. 5. 2. __class_getitem__ so với __getitem__¶Thông thường, đăng ký của một đối tượng sử dụng dấu ngoặc vuông sẽ gọi phương thức thể hiện >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906 được định nghĩa trên lớp của đối tượng. Tuy nhiên, nếu đối tượng được đăng ký chính là một lớp, phương thức lớp def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 có thể được gọi thay thế. def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 sẽ trả về một đối tượng GenericAlias nếu nó được xác định đúng. Được trình bày bằng biểu thức def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)966, trình thông dịch Python tuân theo một quy trình giống như quy trình sau để quyết định nên gọi >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906 hay def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954. def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)9 Trong Python, tất cả các lớp đều là thể hiện của các lớp khác. Lớp của một lớp được gọi là siêu lớp của lớp đó và hầu hết các lớp đều có lớp def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)901 làm siêu lớp của chúng. def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)901 không định nghĩa >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906, nghĩa là các biểu thức như def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)950, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)973 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)974 đều cho kết quả là def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 được gọi. >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}9 Tuy nhiên, nếu một lớp có siêu dữ liệu tùy chỉnh xác định >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906, thì việc đăng ký lớp đó có thể dẫn đến hành vi khác. Một ví dụ về điều này có thể được tìm thấy trong mô-đun def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)977 import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule9 Xem thêm PEP 560 - Hỗ trợ cốt lõi để nhập mô-đun và các loại chungGiới thiệu def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 và phác thảo thời điểm đăng ký dẫn đến việc def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 được gọi thay vì >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906 3. 3. 6. Mô phỏng các đối tượng có thể gọi được¶đối tượng. __call__(bản thân[ , . args...]) ¶Được gọi khi thể hiện được “gọi” là một hàm; 3. 3. 7. Mô phỏng các loại vùng chứa¶Các phương thức sau có thể được định nghĩa để triển khai các đối tượng vùng chứa. Vùng chứa thường là dãy (chẳng hạn như def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)983 hoặc def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)984) hoặc ánh xạ ( . Tập hợp các phương thức đầu tiên được sử dụng để mô phỏng một chuỗi hoặc để mô phỏng một ánh xạ; . Chúng tôi cũng khuyến nghị rằng ánh xạ cung cấp các phương thức def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)988, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)989, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)990, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)991, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)992, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)993, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)994, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)995, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)996 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)997 hoạt động tương tự như đối với các đối tượng >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}978 tiêu chuẩn của Python. Mô-đun def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)999 cung cấp một lớp cơ sở trừu tượng >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}900 abstract base class để giúp tạo các phương thức đó từ một bộ cơ sở gồm >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}902, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}903 và def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)988. Các chuỗi có thể thay đổi nên cung cấp các phương thức >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}905, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}906, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}907, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}908, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}909, def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)994, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}911, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}912 và >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}913, giống như các đối tượng def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)951 tiêu chuẩn của Python. Cuối cùng, các loại trình tự nên thực hiện phép cộng (nghĩa là nối) và phép nhân (nghĩa là lặp lại) bằng cách xác định các phương thức >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}915, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}916, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}917, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}918, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}919 và >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}920 được mô tả bên dưới; . Chúng tôi khuyến nghị rằng cả ánh xạ và trình tự đều triển khai phương pháp >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}921 để cho phép sử dụng hiệu quả toán tử >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}922; . Ngoài ra, chúng tôi khuyến nghị rằng cả ánh xạ và trình tự đều triển khai phương pháp >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'921 để cho phép lặp lại hiệu quả thông qua vùng chứa; . đối tượng. __len__(bản thân) ¶ Được gọi để triển khai chức năng tích hợp sẵn def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)92. Nên trả về chiều dài của đối tượng, một số nguyên def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)99 0. Ngoài ra, một đối tượng không xác định phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}067 và phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}065 của nó trả về 0 được coi là sai trong ngữ cảnh Boolean Chi tiết triển khai CPython. Trong CPython, độ dài được yêu cầu tối đa là >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}930. Nếu chiều dài lớn hơn >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}930, một số tính năng (chẳng hạn như def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)92) có thể tăng >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}933. Để ngăn việc tăng >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}933 bằng cách kiểm tra giá trị thực, một đối tượng phải xác định phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}067đối tượng. __length_hint__(bản thân) ¶ Được gọi để thực hiện >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}936. Nên trả về độ dài ước tính cho đối tượng (có thể lớn hơn hoặc nhỏ hơn độ dài thực tế). Độ dài phải là một số nguyên def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)99 0. Giá trị trả về cũng có thể là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99, được xử lý giống như thể phương thức >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}939 hoàn toàn không tồn tại. Phương pháp này hoàn toàn là một tối ưu hóa và không bao giờ cần thiết cho tính chính xác Mới trong phiên bản 3. 4 Ghi chú Cắt lát được thực hiện độc quyền với ba phương pháp sau. Một cuộc gọi như import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule9 được dịch sang import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule0 và kể từ đó trở đi. Các mục lát bị thiếu luôn được điền bằng >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98đối tượng. __getitem__(bản thân , phím)¶ Được gọi để thực hiện đánh giá của >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}941. Đối với các loại sequence , khóa được chấp nhận phải là số nguyên và đối tượng lát. Lưu ý rằng cách giải thích đặc biệt của các chỉ mục phủ định (nếu lớp muốn mô phỏng một loại dãy ) tùy thuộc vào phương thức >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906. Nếu khóa thuộc loại không phù hợp, >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 có thể được nâng lên; . Đối với các loại ánh xạ , nếu khóa bị thiếu (không có trong vùng chứa), thì phải tăng >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}945. Ghi chú Các vòng lặp >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}946 hy vọng rằng một >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}944 sẽ được nâng lên đối với các chỉ mục không hợp lệ để cho phép phát hiện đúng phần cuối của chuỗi Ghi chú Khi đăng ký một lớp, phương thức lớp đặc biệt def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item)954 có thể được gọi thay vì >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906. Xem __class_getitem__ so với __getitem__ để biết thêm chi tiết. đối tượng. __setitem__(bản thân , phím, value)¶ Được gọi để thực hiện nhiệm vụ cho >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}941. Lưu ý tương tự như đối với >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906. Điều này chỉ nên được thực hiện cho ánh xạ nếu các đối tượng hỗ trợ thay đổi giá trị cho các khóa hoặc nếu các khóa mới có thể được thêm vào hoặc cho các chuỗi nếu các phần tử có thể được thay thế. Các ngoại lệ tương tự sẽ được đưa ra đối với các giá trị khóa không phù hợp như đối với phương pháp >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906đối tượng. __delitem__(bản thân , phím)¶ Được gọi để thực hiện xóa >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}941. Lưu ý tương tự như đối với >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906. Điều này chỉ nên được thực hiện để ánh xạ nếu các đối tượng hỗ trợ loại bỏ các khóa hoặc cho các chuỗi nếu các phần tử có thể được xóa khỏi chuỗi. Các ngoại lệ tương tự sẽ được đưa ra đối với các giá trị khóa không phù hợp như đối với phương pháp >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906đối tượng. __missing__(self , key)¶ Được gọi bởi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}025. >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906 để triển khai >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}941 cho các lớp con dict khi khóa không có trong từ điểnđối tượng. __iter__(bản thân) ¶ Phương thức này được gọi khi cần có bộ lặp cho vùng chứa. Phương thức này sẽ trả về một đối tượng lặp mới có thể lặp qua tất cả các đối tượng trong vùng chứa. Đối với ánh xạ, nó sẽ lặp lại các khóa của vùng chứa. đối tượng. __reversed__(bản thân) ¶Được gọi (nếu có) bởi >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}959 tích hợp để thực hiện phép lặp ngược. Nó sẽ trả về một đối tượng lặp mới lặp lại trên tất cả các đối tượng trong vùng chứa theo thứ tự ngược lại Nếu phương pháp >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}960 không được cung cấp, thì >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}959 tích hợp sẵn sẽ quay trở lại sử dụng giao thức trình tự ( >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}065 và >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906). Các đối tượng hỗ trợ giao thức trình tự chỉ nên cung cấp >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}960 nếu chúng có thể cung cấp cách triển khai hiệu quả hơn cách triển khai do >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}959 cung cấp Các toán tử kiểm tra tư cách thành viên ( >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}922 và >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}967) thường được triển khai như một phép lặp thông qua một vùng chứa. Tuy nhiên, các đối tượng vùng chứa có thể cung cấp phương thức đặc biệt sau với cách triển khai hiệu quả hơn, điều này cũng không yêu cầu đối tượng phải lặp lạiđối tượng. __contains__(bản thân , mục)¶ Được gọi để triển khai toán tử thử nghiệm thành viên. Nên trả về true nếu mục là chính nó, ngược lại là false. Đối với các đối tượng ánh xạ, điều này nên xem xét các khóa của ánh xạ hơn là các giá trị hoặc các cặp khóa-mục Đối với các đối tượng không xác định >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}921, thử nghiệm tư cách thành viên đầu tiên thử lặp qua >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'921, sau đó thử giao thức lặp trình tự cũ qua >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'906, xem phần này trong tham chiếu ngôn ngữ . . . 3. 3. 8. Mô phỏng các kiểu số¶Các phương thức sau đây có thể được định nghĩa để mô phỏng các đối tượng số. Các phương thức tương ứng với các hoạt động không được hỗ trợ bởi loại số cụ thể được triển khai (e. g. , hoạt động theo bit cho các số không tách rời) sẽ không được xác định đối tượng. __add__(bản thân , khác . )¶object.__sub__(bản thân , khác . )¶object.__mul__(bản thân , khác . )¶object.__matmul__(bản thân , khác . )¶object.__truediv__(bản thân , khác . )¶object.__floordiv__(bản thân , khác . )¶object.__mod__(bản thân , khác . )¶object.__divmod__(bản thân , khác . )¶object.__pow__(bản thân , khác . [, modulo])¶object.__lshift__(bản thân , khác . )¶object.__rshift__(bản thân , khác . )¶object.__and__(bản thân , khác . )¶object.__xor__(bản thân , khác . )¶object.__or__(bản thân , khác)¶Các phương thức này được gọi để thực hiện các phép tính số học nhị phân ( >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}971, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}972, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}973, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}974, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}975, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}976, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}977, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}978, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}979, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}980, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}981, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}982, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}983, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}984, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}985). Chẳng hạn, để đánh giá biểu thức >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}986, trong đó x là một thể hiện của lớp có phương thức >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}915, thì >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}988 được gọi. Phương pháp >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}989 phải tương đương với việc sử dụng >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}990 và >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}991; . Lưu ý rằng >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}993 phải được xác định để chấp nhận đối số thứ ba tùy chọn nếu phiên bản ternary của hàm >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}979 tích hợp được hỗ trợ Nếu một trong những phương thức đó không hỗ trợ thao tác với các đối số được cung cấp, thì nó sẽ trả về >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99đối tượng. __radd__(bản thân , khác . )¶object.__rsub__(bản thân , khác . )¶object.__rmul__(bản thân , khác . )¶object.__rmatmul__(bản thân , khác . )¶object.__rtruediv__(bản thân , khác . )¶object.__rfloordiv__(bản thân , khác . )¶object.__rmod__(bản thân , khác . )¶object.__rdivmod__(bản thân , khác . )¶object.__rpow__(bản thân , khác . [, modulo])¶object.__rlshift__(bản thân , khác . )¶object.__rrshift__(bản thân , khác . )¶object.__rand__(bản thân , khác . )¶object.__rxor__(bản thân , khác . )¶object.__ror__(bản thân , khác)¶ Các phương thức này được gọi để thực hiện các phép toán số học nhị phân ( >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}971, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}972, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}973, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}974, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}975, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}976, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}977, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}978, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}979, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}980, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}981, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}982, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}983, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}984, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}985) với các toán hạng được phản ánh (hoán đổi). Các hàm này chỉ được gọi nếu toán hạng bên trái không hỗ trợ thao tác 3 tương ứng và các toán hạng thuộc các loại khác nhau. 4 Ví dụ, để đánh giá biểu thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule911, trong đó y là một thể hiện của một lớp có phương pháp import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule912, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule913 được gọi là nếu import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule914 trả về Lưu ý rằng ternary >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}979 sẽ không thử gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule916 (các quy tắc cưỡng chế sẽ trở nên quá phức tạp) Ghi chú Nếu kiểu của toán hạng bên phải là lớp con của kiểu toán hạng bên trái và lớp con đó cung cấp cách triển khai khác của phương thức được phản ánh cho thao tác, thì phương thức này sẽ được gọi trước phương thức không được phản ánh của toán hạng bên trái. Hành vi này cho phép các lớp con ghi đè hoạt động của tổ tiên của chúng đối tượng. __iadd__(bản thân , khác . )¶object.__isub__(bản thân , khác . )¶object.__imul__(bản thân , khác . )¶object.__imatmul__(bản thân , khác . )¶object.__itruediv__(bản thân , khác . )¶object.__floordiv__(bản thân , khác . )¶object.__imod__(bản thân , khác . )¶object.__ipow__(bản thân , khác . [, modulo])¶object.__ilshift__(bản thân , khác . )¶object.__irshift__(bản thân , khác . )¶object.__iand__(bản thân , khác . )¶object.__ixor__(bản thân , khác . )¶object.__ior__(bản thân , khác)¶Các phương thức này được gọi để thực hiện các bài tập số học tăng cường ( import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule917, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule918, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule919, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule920, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule921, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule922, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule923, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule924, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule925, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule926, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule927, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule928, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule929). Các phương thức này sẽ cố gắng thực hiện thao tác tại chỗ (bản thân sửa đổi) và trả về kết quả (có thể, nhưng không nhất thiết phải là bản thân). Nếu một phương thức cụ thể không được xác định, phép gán tăng cường sẽ quay trở lại các phương thức thông thường. Chẳng hạn, nếu x là một thể hiện của một lớp có phương thức >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}917, thì import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule931 tương đương với import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule932. Mặt khác, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule933 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule934 được xem xét, giống như đánh giá của >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}986. Trong một số trường hợp nhất định, phép gán tăng cường có thể dẫn đến lỗi không mong muốn (xem Tại sao a_tuple[i] += ['item'] đưa ra ngoại lệ khi phép bổ sung hoạt động?), but this behavior is in fact part of the data model.đối tượng. __neg__(bản thân) ¶ . object.__pos__(bản thân) ¶ . object.__abs__(bản thân) ¶ . object.__invert__(bản thân) ¶ Được gọi để thực hiện các phép toán số học đơn vị ( >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}972, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}971, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule938 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule939)đối tượng. __complex__(bản thân) ¶ . object.__int__(bản thân) ¶ . object.__float__(bản thân) ¶ Được gọi để triển khai các chức năng tích hợp sẵn import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule940, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule941 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule942. Nên trả về một giá trị của loại thích hợpđối tượng. __index__(bản thân) ¶ Được gọi để triển khai import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule943 và bất cứ khi nào Python cần chuyển đổi dễ dàng đối tượng số thành đối tượng số nguyên (chẳng hạn như trong cắt lát hoặc trong các hàm import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule944, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule945 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule946 tích hợp sẵn). Sự hiện diện của phương thức này chỉ ra rằng đối tượng số là một kiểu số nguyên. Phải trả về một số nguyên Nếu import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule947, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule948 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule949 không được xác định thì các hàm tích hợp tương ứng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule941, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule942 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule940 sẽ quay trở lại import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule953đối tượng. __round__(bản thân[ , . ndigits])¶object.__trunc__(bản thân) ¶ . object.__floor__(bản thân) ¶ . object.__ceil__(bản thân) ¶ Được gọi để thực hiện chức năng tích hợp sẵn import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule954 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule72 chức năng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule956, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule957 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule958. Trừ khi ndigits được chuyển đến import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule959, tất cả các phương thức này sẽ trả về giá trị của đối tượng bị cắt bớt thành một import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule960 (thường là một >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}09) Hàm tích hợp sẵn import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule941 chuyển về import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule963 nếu cả import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule947 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule953 đều không được xác định Đã thay đổi trong phiên bản 3. 11. Việc ủy quyền của import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule941 cho import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule963 không được chấp nhận. 3. 3. 9. Với Trình quản lý ngữ cảnh câu lệnh¶Trình quản lý bối cảnh là một đối tượng xác định bối cảnh thời gian chạy sẽ được thiết lập khi thực thi câu lệnh class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass8. Trình quản lý ngữ cảnh xử lý việc nhập và thoát khỏi ngữ cảnh thời gian chạy mong muốn để thực thi khối mã. Trình quản lý bối cảnh thường được gọi bằng cách sử dụng câu lệnh class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass8 (được mô tả trong phần Câu lệnh with ), nhưng cũng có thể được sử dụng bằng cách gọi trực tiếp các phương thức của chúng. Các ứng dụng điển hình của trình quản lý bối cảnh bao gồm lưu và khôi phục các loại trạng thái toàn cầu khác nhau, khóa và mở khóa tài nguyên, đóng các tệp đã mở, v.v. Để biết thêm thông tin về trình quản lý ngữ cảnh, hãy xem Các loại trình quản lý ngữ cảnh . đối tượng. __enter__(bản thân) ¶Nhập bối cảnh thời gian chạy liên quan đến đối tượng này. Câu lệnh class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass8 sẽ ràng buộc giá trị trả về của phương thức này với (các) mục tiêu được chỉ định trong mệnh đề import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule971 của câu lệnh, nếu cóđối tượng. __exit__(self , exc_type, exc_value, traceback)¶ Thoát bối cảnh thời gian chạy liên quan đến đối tượng này. Các tham số mô tả ngoại lệ khiến ngữ cảnh bị thoát. Nếu ngữ cảnh đã thoát mà không có ngoại lệ, thì cả ba đối số sẽ là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 Nếu một ngoại lệ được cung cấp và phương thức muốn loại bỏ ngoại lệ đó (i. e. , ngăn nó lan truyền), nó sẽ trả về một giá trị thực. Mặt khác, ngoại lệ sẽ được xử lý bình thường khi thoát khỏi phương thức này Lưu ý rằng các phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule973 không được tăng lại ngoại lệ đã truyền vào; Xem thêm PEP 343 - Câu lệnh “với”Thông số kỹ thuật, nền tảng và ví dụ cho câu lệnh Python class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass8 3. 3. 10. Tùy chỉnh đối số vị trí trong khớp mẫu lớp¶Khi sử dụng tên lớp trong một mẫu, các đối số vị trí trong mẫu không được phép theo mặc định, tôi. e. import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule975 thường không hợp lệ nếu không có hỗ trợ đặc biệt trong >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}998. Để có thể sử dụng loại mẫu đó, lớp cần xác định thuộc tính __match_args__đối tượng. __match_args__ ¶ Biến lớp này có thể được gán một bộ chuỗi. Khi lớp này được sử dụng trong mẫu lớp có đối số vị trí, mỗi đối số vị trí sẽ được chuyển đổi thành đối số từ khóa, sử dụng giá trị tương ứng trong __match_args__ làm từ khóa. Việc không có thuộc tính này tương đương với việc đặt nó thành import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule977 Ví dụ: nếu import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule978 là import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule979 có nghĩa là import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule975 tương đương với import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule981. Lưu ý rằng số đối số trong mẫu phải nhỏ hơn hoặc bằng số phần tử trong __match_args__; Mới trong phiên bản 3. 10 Xem thêm PEP 634 - Kết hợp mô hình cấu trúcThông số kỹ thuật cho câu lệnh Python import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule983 3. 3. 11. Tra cứu phương thức đặc biệt¶Đối với các lớp tùy chỉnh, các lời gọi ẩn của các phương thức đặc biệt chỉ được đảm bảo hoạt động chính xác nếu được định nghĩa trên một loại đối tượng, không phải trong từ điển thể hiện của đối tượng. Hành vi đó là lý do tại sao đoạn mã sau đưa ra một ngoại lệ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule1 Lý do đằng sau hành vi này nằm ở một số phương thức đặc biệt như >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015 và >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}06 được triển khai bởi tất cả các đối tượng, bao gồm cả đối tượng kiểu. Nếu tra cứu ẩn của các phương thức này sử dụng quy trình tra cứu thông thường, chúng sẽ thất bại khi được gọi trên chính đối tượng loại import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule2 Việc cố gọi sai một phương thức không liên kết của một lớp theo cách này đôi khi được gọi là 'sự nhầm lẫn siêu lớp' và tránh được bằng cách bỏ qua thể hiện khi tra cứu các phương thức đặc biệt import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule3 Ngoài việc bỏ qua bất kỳ thuộc tính thể hiện nào vì lợi ích của tính chính xác, tra cứu phương thức đặc biệt ngầm thường cũng bỏ qua phương thức >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}070 ngay cả trong siêu dữ liệu của đối tượng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule4 Bỏ qua máy móc >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}070 theo cách này cung cấp phạm vi đáng kể cho việc tối ưu hóa tốc độ trong trình thông dịch, với chi phí linh hoạt trong việc xử lý các phương thức đặc biệt (phương thức đặc biệt phải được đặt trên chính đối tượng lớp để được trình thông dịch gọi một cách nhất quán 3. 4. Coroutines¶3. 4. 1. Đối tượng có thể chờ đợi¶Một awaitable thường triển khai một phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule988. Các đối tượng Coroutine được trả về từ các hàm import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule59 có thể chờ được. Ghi chú Các đối tượng trình lặp trình tạo được trả về từ trình tạo được trang trí bằng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule990 cũng có thể chờ đợi, nhưng chúng không triển khai import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule988. đối tượng. __await__(bản thân) ¶ Phải trả về một trình lặp . Nên được sử dụng để triển khai các đối tượng awaitable . Chẳng hạn, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule992 triển khai phương thức này để tương thích với biểu thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule60. Mới trong phiên bản 3. 5 Xem thêm PEP 492 để biết thêm thông tin về các đối tượng có thể chờ đợi 3. 4. 2. Đối tượng Coroutine¶Các đối tượng Coroutine là các đối tượng có thể chờ đợi . Việc thực thi của một coroutine có thể được kiểm soát bằng cách gọi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule988 và lặp lại kết quả. Khi coroutine thực thi xong và trả về, iterator tăng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule58 và thuộc tính >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}094 của ngoại lệ giữ giá trị trả về. Nếu coroutine đưa ra một ngoại lệ, nó sẽ được nhân rộng bởi iterator. Coroutines không nên trực tiếp đưa ra các ngoại lệ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule58 chưa được xử lý. Các coroutine cũng có các phương thức được liệt kê bên dưới, tương tự như các phương thức của bộ tạo (xem Các phương pháp bộ tạo-lặp ). Tuy nhiên, không giống như các trình tạo, các coroutine không hỗ trợ trực tiếp phép lặp. Đã thay đổi trong phiên bản 3. 5. 2. Đó là một class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass89 để chờ đợi trên một coroutine nhiều lần. quy trình. gửi(giá trị) ¶ Bắt đầu hoặc tiếp tục thực thi coroutine. Nếu giá trị là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98, điều này tương đương với việc nâng cấp trình vòng lặp được trả về bởi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule988. Nếu giá trị không phải là >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98, thì phương thức này ủy quyền cho phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule902 của trình vòng lặp khiến quy trình đăng ký tạm dừng. Kết quả (giá trị trả về, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule58 hoặc ngoại lệ khác) giống như khi lặp qua giá trị trả về import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule988, được mô tả ở trênquy trình. ném(giá trị) ¶ . coroutine.ném(loại[ , value[, traceback]]) Tăng ngoại lệ được chỉ định trong coroutine. Phương thức này ủy quyền cho phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule905 của iterator khiến coroutine tạm dừng, nếu nó có phương thức như vậy. Mặt khác, ngoại lệ được nâng lên tại điểm treo. Kết quả (giá trị trả về, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule58 hoặc ngoại lệ khác) giống như khi lặp qua giá trị trả về import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule988, được mô tả ở trên. Nếu ngoại lệ không bị bắt trong coroutine, nó sẽ truyền lại cho người gọiquy trình. đóng() ¶ Khiến coroutine tự dọn dẹp và thoát. Nếu coroutine bị đình chỉ, phương thức này trước tiên sẽ ủy quyền cho phương thức class Philosopher: def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name class AustralianPhilosopher(Philosopher, default_name="Bruce"): pass5 của iterator khiến coroutine bị đình chỉ, nếu nó có một phương thức như vậy. Sau đó, nó tăng import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule909 tại điểm treo, khiến coroutine ngay lập tức tự dọn dẹp. Cuối cùng, coroutine được đánh dấu là đã thực thi xong, ngay cả khi nó chưa bao giờ được bắt đầu Các đối tượng Coroutine được tự động đóng bằng quy trình trên khi chúng sắp bị hủy 3. 4. 3. Trình lặp không đồng bộ¶Trình lặp không đồng bộ có thể gọi mã không đồng bộ trong phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule910 của nó Trình vòng lặp không đồng bộ có thể được sử dụng trong câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule62đối tượng. __aiter__(bản thân) ¶ Phải trả về một đối tượng lặp không đồng bộ đối tượng. __anext__(bản thân) ¶Phải trả về một kết quả có thể chờ đợi trong giá trị tiếp theo của trình vòng lặp. Sẽ phát sinh lỗi import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule69 khi quá trình lặp lại kết thúc Một ví dụ về một đối tượng có thể lặp lại không đồng bộ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule5 Mới trong phiên bản 3. 5 Đã thay đổi trong phiên bản 3. 7. Trước Python 3. 7, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule913 có thể trả về một sự chờ đợi sẽ phân giải thành trình lặp không đồng bộ . Bắt đầu với Python 3. 7, import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule913 phải trả về một đối tượng lặp không đồng bộ. Trả lại bất kỳ thứ gì khác sẽ dẫn đến lỗi >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}02 3. 4. 4. Trình quản lý ngữ cảnh không đồng bộ¶Trình quản lý bối cảnh không đồng bộ là trình quản lý bối cảnh có thể tạm dừng thực thi trong các phương thức import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule916 và import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule917 của nó Trình quản lý bối cảnh không đồng bộ có thể được sử dụng trong câu lệnh import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule61đối tượng. __aenter__(bản thân) ¶ Tương tự về mặt ngữ nghĩa với import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule919, điểm khác biệt duy nhất là nó phải trả về một giá trị chờ đợiđối tượng. __aexit__(bản thân , exc_type, exc_value, traceback)¶ Tương tự về mặt ngữ nghĩa với import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule973, điểm khác biệt duy nhất là nó phải trả về một giá trị chờ Một ví dụ về lớp trình quản lý ngữ cảnh không đồng bộ import sys from types import ModuleType class VerboseModule(ModuleType): def __repr__(self): return f'Verbose {self.__name__}' def __setattr__(self, attr, value): print(f'Setting {attr}...') super().__setattr__(attr, value) sys.modules[__name__].__class__ = VerboseModule6 Mới trong phiên bản 3. 5 chú thích 1Trong một số trường hợp, có thể thay đổi loại đối tượng, trong các điều kiện được kiểm soát nhất định. Mặc dù vậy, nhìn chung đó không phải là một ý kiến hay vì nó có thể dẫn đến một số hành vi rất kỳ lạ nếu xử lý không đúng cách. 2Các phương pháp >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32}015, >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'921, >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}960 và >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}921 có cách xử lý đặc biệt cho việc này; 3 “Không hỗ trợ” ở đây có nghĩa là lớp không có phương thức như vậy hoặc phương thức trả về >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'99. Không đặt phương thức thành >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3'98 nếu bạn muốn buộc dự phòng cho phương thức được phản ánh của toán hạng bên phải—thay vào đó, điều đó sẽ có tác dụng ngược lại là chặn dự phòng đó một cách rõ ràng4 Đối với các toán hạng cùng loại, người ta cho rằng nếu phương thức không được phản ánh – chẳng hạn như >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'}915 – không thành công thì hoạt động tổng thể không được hỗ trợ, đó là lý do tại sao phương thức được phản ánh không được gọi __ Getitem __ trong Python là gì?__getitem__ được dùng để lấy một mục từ thuộc tính của thực thể được gọi . __getitem__ thường được sử dụng với các thùng chứa như danh sách, tuple, v.v. Phương thức __setitem__ được sử dụng để đặt mục thành một chỉ mục cụ thể của thuộc tính của phiên bản được gọi.
__ str __ trong Python là gì?Trăn __str__()
. Phương thức này được gọi khi hàm print() hoặc str() được gọi trên một đối tượng. Phương thức này phải trả về đối tượng String. This method returns the string representation of the object. This method is called when print() or str() function is invoked on an object. This method must return the String object.
__ thêm __ trong Python là gì?Hàm __add__() của Python là một trong những phương thức kỳ diệu trong Python trả về một đối tượng mới(thứ ba) i. e. việc thêm hai đối tượng còn lại . Nó triển khai toán tử cộng “+” trong Python.
Các phương thức Dunder trong Python là gì?Python - Phương pháp Magic hoặc Dunder. Các phương thức ma thuật trong Python là các phương thức đặc biệt bắt đầu và kết thúc bằng hai dấu gạch dưới . Chúng còn được gọi là phương pháp dunder. Các phương thức ma thuật không có nghĩa là bạn phải gọi trực tiếp, nhưng việc gọi xảy ra bên trong lớp trên một hành động nhất định. |