Bạn cần bọc [hoặc, trong Python 2. 2, kế thừa từ] một danh sách hoặc bộ, ủy quyền một số thao tác cho nó và muốn cung cấp khả năng cắt lát thích hợp [i. e. , thông qua phương pháp đặc biệt
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b2]
Trong hầu hết các trường hợp, việc ghi đè các phương thức đặc biệt của các đối tượng tích hợp sẵn khi bạn kế thừa từ các đối tượng đó [hoặc bọc chúng bằng ủy quyền tự động, về mặt kỹ thuật không phải là ghi đè] không đặt ra thách thức đặc biệt nào. Khi kế thừa trong Python 2. 2, bạn có thể gọi phương thức đặc biệt của lớp cha với cú pháp phương thức không ràng buộc thông thường. Khi ngắt dòng, hãy sử dụng cú pháp dành riêng cho hoạt động, chẳng hạn như
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b3 để lập chỉ mục
Cắt lát khó hơn, bởi vì trong khi cắt lát phải trải qua cùng một phương pháp đặc biệt
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b2 như lập chỉ mục [kể từ Python 2. 0], danh sách và bộ dữ liệu vẫn triển khai cách tiếp cận cũ hơn. phương pháp đặc biệt hạn chế hơn
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b5 [và tương tự cho
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b6 so với
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b7 và
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b8 so với
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b9]. Vì vậy, bạn phải cung cấp một biện pháp khắc phục, thông thường là bằng số
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b0/
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b1
class SliceTester: def _ _init_ _[self]: self.data = ['zero', 'one', 'two', 'three', 'four'] def _ _getitem_ _[self, indexOrSlice]: try: return self.data[indexOrSlice] except TypeError: return self.data[indexOrSlice.start:indexOrSlice.stop]
Khi một lớp do người dùng định nghĩa kết thúc [hoặc, trong Python 2. 2, kế thừa từ] một danh sách hoặc bộ dữ liệu, nó thường cần xác định các phương thức đặc biệt của
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b2 và
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b3 và ủy quyền một phần hoặc toàn bộ hoạt động của chúng cho đối tượng tích hợp [hoặc được kế thừa] để cung cấp quyền truy cập chính xác vào dữ liệu
Tài liệu về Python 2. 0 trở lên không dùng nữa việc sử dụng
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b5 và
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b7. Thay vào đó, nó gợi ý cung cấp các phiên bản mở rộng phù hợp của
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b2 và
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b6. Đây là một ý tưởng thực sự xuất sắc vì nó cho phép sử dụng các phương pháp cắt lát dạng mở rộng [bao gồm bước, dấu chấm lửng, v.v.] mà Numeric Python đã khiến những người dùng thông thường của nó trở nên rất phổ biến. Thật không may, nếu bạn cố chuyển một đối tượng lát sang các phương thức đặc biệt hướng mục của một đối tượng danh sách hoặc bộ, bạn sẽ nhận được một
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b8;
May mắn thay, giải quyết vấn đề này không kịch tính như tất cả những điều đó. Bạn chỉ cần bẫy
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b8 mà bạn nhận được từ việc cố gắng lập chỉ mục một chuỗi lỗi thời bằng một lát cắt và khắc phục nó một cách phù hợp. Đây là mã tự kiểm tra điển hình mà bạn có thể thêm vào mô-đun của công thức và thực thi khi mã này được chạy dưới dạng tập lệnh chính
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b
Trong lớp ví dụ
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b20 của công thức, biện pháp khắc phục khá tối thiểu; . Bạn có thể muốn làm nhiều hơn nữa [bước triển khai, dấu chấm lửng, v.v.]
Lưu ý rằng công thức này không bao gồm tất cả các trường hợp có thể sử dụng lát. Có một đối số thứ ba cho toán tử lát cắt xác định bước hoặc sải chân của việc cắt lát. Ví dụ: nếu
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b22 là một mảng Numeric Python [phần mềm được sử dụng rộng rãi duy nhất hỗ trợ cắt lát ở tất cả vinh quang của nó], thì
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b23 trả về chuỗi
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b24,
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b25,
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b26—tối đa là
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b27. Tương tự,
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b28 trả về một chuỗi chứa nội dung của
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b22 bị đảo ngược. Đối số thứ ba cho toán tử lát cắt được lưu trữ trong thuộc tính
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b30 của các đối tượng lát cắt và được đặt thành
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b31 nếu một bước không được chỉ định [như trong
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b32]. Vì điều này, không có gì ngạc nhiên khi công thức được hiển thị trước đó sẽ không thêm hỗ trợ cho các bước một cách kỳ diệu cho các đối tượng không hỗ trợ các lát cắt kiểu mới
Điểm của công thức này là bạn phải nhận thức được những hạn chế này và thực hiện các biện pháp phòng ngừa. Ngoài ra, không kiểm tra loại cho một
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b33 loại
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b21. Nếu việc lập chỉ mục thông thường từ chối chỉ mục, tốt hơn hết bạn nên nắm bắt
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b8 trong mệnh đề
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b1 và nhập một
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b0/
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b1 khác trong đó bạn cố gắng sử dụng
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b33 làm
if _ _name_ _ == "_ _main_ _": theSlice = SliceTester[ ] a = theSlice[2] b = theSlice[:3] print a print b21 mà bây giờ bạn mong đợi. Điều này cho phép mã máy khách chuyển cho bạn các đối tượng đa hình để cắt các đối tượng
Phần Tham khảo ngôn ngữ về cắt lát;