Những hiểu biết cơ bản về Python cho người mới bắt đầu

23 328 0
Những hiểu biết cơ bản về Python cho người mới bắt đầu

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Tại sao Python lại được dùng trong lĩnh vực AI?,sự khác biệt giữa C và Python là gì?,những kiến thức cơ bản về Python ,các cú pháp cơ bản trong Python cho người mới bắt đầu,Hiểu về các thư viện các Class cơ bản trong Python

1 Classes -Các Class cung cấp phương tiện kết hợp liệu chức với Tạo Class tạo kiểu Object mới, cho phép tạo cá thể kiểu Mỗi cá thể Class có thuộc tính gắn liền với để trì trạng thái -So với ngơn ngữ lập trình khác, chế Class Python bổ sung Class với tối thiểu cú pháp ngữ nghĩa Nó hỗn hợp chế Class tìm thấy C Modula-3 Các Class Python cung cấp tất tính tiêu chuẩn Lập trình hướng Object: chế thừa kế Class cho phép nhiều Class sở, Class dẫn xuất ghi đè lên phương thức Class sở Class sở nó, phương thức gọi phương thức Class sở có tên Object chưa số lượng tùy ý loại liệu Như mô-đun, Class tham gia vào chất động Python: chúng tạo thời gian chạy, sửa đổi thêm sau tạo Trong thuật ngữ C , thành viên Class thông thường (bao gồm thành viên liệu) công khai (ngoại trừ xem Biến riêng), tất hàm thành viên ảo Như Modula-3, khơng có viết tắt để tham chiếu thành viên Object từ phương thức nó: hàm phương thức khai báo với đối số rõ ràng đại diện cho Object,được cung cấp ngầm gọi (Thiếu thuật ngữ chấp nhận phổ biến để nói lớp học, sử dụng thuật ngữ Smalltalk C++.Tôi sử dụng thuật ngữ Modula-3, ngữ nghĩa hướng Object gần gũi với ngữ nghĩa Python so với C , tơi mong người đọc nghe nó.) 1.1 Vấn đề Names Object Các Object có tính cá nhân nhiều tên (trong nhiều phạm vi) bị ràng buộc vào Object Điều gọi cưa ngôn ngữ khác Điều thường không đánh giá cao nhìn Python, bỏ qua cách an toàn giao dịch với loại không thay đổi (số, chuỗi, liệu) Tuy nhiên, cưa có tác dụng đáng ngạc nhiên ngữ nghĩa mã Python liên quan đến Object thay đổi danh sách, từ điển hầu hết loại khác Điều thường sử dụng lợi ích chương trình ,vì bí danh hoạt động trỏ số khía cạnh Ví dụ, việc truyền Object rẻ có trỏ thực thi; hàm sửa đổi Object truyền vào đối số, người gọi thấy thay đổi-điều loại bỏ cần thiết hai chế truyền tham số khác pascal 1.2 Python phạm vi khoảng tên trống Trước giới thiệu Class, trước tiên tơi phải nói cho bạn điều quy tắc phạm vi Python Định nghĩa Class phát số thủ thuật gọn gàng với không gian tên bạn cần biết cách phạm vi không gian hoạt động để hiểu đầy đủ diễn Ngẫu nhiên, kiến thức chủ đề hữu ích cho lập trình viên Python tiên tiến bắt đầu số định nghĩa Một không gian tên ánh xạ từ tên đến Object Hầu hết không gian tên triển khai dạng từ điển Python, thường không đáng ý theo cách (ngoại trừ hiệu suất )và thay đổi tương lai Ví dụ không gian tên là: tập hợp tên dựng sẵn (chứa hàm abs () tên ngoại lệ có sẵn); tên tồn cầu mơ-đun; tên địa phương lời gọi hàm Trong nghĩa đó,tập thuộc tính Object tạo thành vùng tên Điều quan trọng cần biết khơng gian tên hồn tồn khơng có mối quan hệ tên không gian tên khác nhau; ví dụ: hai mơ-đun khác vừa định nghĩa hàm tối đa mà khơng có nhầm lẫn - người dùng mô-đun phải đặt tiền tố với tên mơ-đun Nhân tiện, tơi sử dụng thuộc tính word cho tên sau dấu chấm - ví dụ, biểu thức z.real, real thuộc tính Object z Nói ra, tham chiếu đến tên mơ-đun tham chiếu thuộc tính: biểu thức modname.funcname, modname Object mô-đun funcname thuộc tính Trong trường hợp này,sẽ xảy cách đơn giản Thuộc tính đọc ghi Trong trường hợp sau, việc gán cho thuộc tính Các thuộc tính mơ-đun ghi được: bạn viết modname.the_answer = 42 Các thuộc tính ghi xóa với câu lệnh del Ví dụ: del modname.the_answer xóa thuộc tính the_answer khỏi Object có tên modname Không gian tên tạo thời điểm khác có thời gian sống khác Không gian tên chứa tên dựng sẵn tạo trình thơng dịch Python khởi động khơng bị xóa Khơng gian tên chung cho mơ-đun tạo định nghĩa mô-đun đọc; thông thường, không gian tên môđun kéo dài thơng dịch viên Các câu lệnh thực lời gọi cao cấp trình thơng dịch đọc từ tập tin kịch tương tác, coi phần mô-đun gọi main , đó, họ có khơng gian tên chung riêng họ (Tên xây dựng thực tế sống môdun,điều gọi builtins) Không gian tên cục cho hàm tạo hàm gọi, bị xóa hàm trả đặt ngoại lệ không xử lý hàm (Trên thực tế, quên cách tốt để mô tả thực xảy ra.) Tất nhiên, invocations đệ quy có khơng gian tên địa phương riêng họ Phạm vi vùng văn chương trình Python, khơng gian tên truy cập trực tiếp "Trực tiếp truy cập" có nghĩa tham chiếu không đủ tiêu chuẩn cho tên cố gắng tìm tên cho khơng gian tên Mặc dù phạm vi xác định tĩnh, chúng sử dụng động Bất lúc trình thực hiện, có ba phạm vi lồng có khơng gian tên truy cập trực tiếp: • phạm vi bên nhất, tìm kiếm đầu tiên, chứa tên địa phương • phạm vi chức kèm theo nào, tìm kiếm bắt đầu gần • phạm vi đến cuối chứa tên tồn cục mơ-đun • phạm vi ngồi (tìm kiếm cuối cùng) vùng tên chứa tên dựng sẵn Nếu tên khai báo tồn cục, tất tham chiếu tập chuyển trực tiếp đến phạm vi chứa tên tồn cầu mơ-đun Để khơi phục lại biến tìm thấy bên ngồi pham vi bên nhât,câu lệnh nonlocal sử dụng ; không khai báo nonlocal, biến read-only (một nỗ lực để ghi vào biến tạo biến cục phạm vi bên nhất, để biến không thay đổi được đặt tên giống hệt nhau) Thông thường, phạm vi cục tham chiếu đến tên cục hàm (văn bản) Các hàm bên ngồi, phạm vi cục tham chiếu khơng gian tên phạm vi tồn cục: khơng gian tên mô dun.Các định nghĩa Class đặt không gian khác cho phạm vi cục Điều quan trọng nhận phạm vi xác định văn bản: phạm vi toàn cầu hàm định nghĩa mô-đun không gian tên mô-đun, từ đâu bí danh mà hàm gọi Mặt khác, tìm kiếm thực tế tên thực động, vào thời gian chạy - nhiên, định nghĩa ngôn ngữ phát triển theo độ phân giải tên tĩnh, vào thời gian "biên dịch", đó, không dựa vào độ phân giải tên động!(thực tế,các biến cục xác định tĩnh) Một điều kỳ quặc đặc biệt Python - khơng có câu lệnh chung có hiệu lực - việc gán cho tên vào phạm vi bên Các tập không chép liệu - chúng liên kết tên với Object Điều tương tự việc xóa: câu lệnh del x loại bỏ ràng buộc x từ không gian tên tham chiếu phạm vi cục Trên thực tế, tất hoạt động giới thiệu tên sử dụng phạm vi địa phương cụ thể, câu lệnh nhập định nghĩa hàm liên kết tên mô-đun hàm phạm vi cục Câu lệnh chung sử dụng để biến cụ thể sống phạm vi toàn cầu hồi phục đó; câu lệnh nonlocal cho biết biến cụ thể sống phạm vi kèm theo phục hồi 1.2.1 Phạm vi khoảng tên trống ví dụ Đây ví dụ minh họa cách tham khảo phạm vi không gian tên khác mức độ ảnh hưởng biến tồn cầu khơng liên quan đến biến: def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spam = "nonlocal spam" def do_global(): global spam spam = "global spam" spam = "test spam" do_local() print("After local assignment:", spam) do_nonlocal() print("After nonlocal assignment:", spam) do_global() print("After global assignment:", spam) scope_test() print("In global scope:", spam) Đầu mã ví dụ : After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam Lưu ý cách gán địa phương (mặc định) khơng thay đổi tính ràng buộc spam scope_test Nhiệm vụ không tập trung thay đổi ràng buộc scope_test spam nhiệm vụ toàn cục thay đổi ràng buộc cấp modun Bạn thấy khơng có ràng buộc trước cho spam trước gán tồn cầu 1.3 A First Look at Classes Các Class giới thiệu chút cú pháp mới, ba kiểu Object số ngữ nghĩa 1.3.1 Class Definition Syntax Dạng định nghĩa Class đơn giản trông giống sau: class ClassName: Các định nghĩa Class, định nghĩa hàm (câu lệnh def) phải thực trước chúng có hiệu lực (Bạn định nghĩa cách định nghĩa Class nhánh câu lệnh if bên hàm) Trong thực tế, câu lệnh bên định nghĩa Class thường định nghĩa chức năng, câu lệnh khác cho phép hữu ích - quay lại sau Các định nghĩa hàm bên Class thường có dạng danh sách đối số đặc biệt, định quy ước gọi cho phương thức - lần nữa, điều giải thích sau Khi định nghĩa Class nhập vào, vùng tên tạo ra, sử dụng phạm vi cục - đó, tất gán cho biến cục vào không gian tên Đặc biệt,nghĩa hàm liên kết tên hàm Khi định nghĩa Class để lại bình thường (thơng qua kết thúc), Object Class tạo Về bản, trình bao bọc xung quanh nội dung khơng gian tên tạo định nghĩa Class;chúng ta tìm hiểu thêm Object Class phần tiêp theo 1.3.2 Class Objects Các Object Class hỗ trợ hai loại hoạt động: tham chiếu thuộc tính thuyết trình Tham chiếu thuộc tính sử dụng cú pháp tiêu chuẩn sử dụng cho tất tham chiếu thuộc tính Python: obj.name Tên thuộc tính hợp lệ tất tên không gian tên Class Object Class tạo.vì định nghĩa Class trông này: class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world' sau MyClass.i MyClass.f tham chiếu thuộc tính hợp lệ, trả số nguyên Object hàm tương ứng Các thuộc tính Class gán cho, bạn thay đổi giá trị Myclass.i cách gán _doc_ thuộc tính hợp lệ ,trả chuỗi tài liệu thuộc Class: Class instantiation sử dụng ký hiệu hàm Chỉ cần giả vờ Object Class hàm không tham số trả cá thể Class Ví dụ (giả sử Class trên): x = MyClass() tạo thể Class gán Object cho biến cục x Thao tác khởi tạo ("gọi" Object Class) tạo Object trống Nhiều Class muốn tạo Object với cá thể tùy chỉnh theo trạng thái ban đầu cụ thể Do Class định nghĩa phương thức đặc biệt có tên_init_(),như sau def init (self): self.data = [] Khi Class định nghĩa phương thức init (), Class instantiation tự động gọi init () cho cá thể Class tạo Vì vậy, ví dụ này, thể khởi tạo thu cách: x = MyClass() Tất nhiên, phương thức init () có đối số cho tính linh hoạt cao Trong trường hợp đó, đối số đưa cho toán tử instantiation class truyền vào init () Ví dụ, >>> >>> class Complex: def init (self, realpart, imagpart): self.r = realpart self.i = imagpart >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5) 1.3.3 Instance Objects Bây làm với Object thể hiện? Các hoạt động hiểu Object instance tham chiếu thuộc tính Có hai loại tên thuộc tính hợp lệ, thuộc tính hợp lệ ,thuộc tính liệu phương thức thuộc tính liệu tương ứng với "các biến cá thể" Smalltalk "các thành viên liệu" C Các thuộc tính liệu khơng cần khai báo; giống biến cục bộ, chúng xuất chúng gắn cho, Ví dụ, x cá thể MyClass tạo trên, đoạn mã sau in giá trị 16, mà không để lại dấu vết: x.counter = while x.counter < 10: x.counter = x.counter * print(x.counter) del x.counter Loại tham chiếu thuộc tính instance khác phương thức Phương thức hàm "thuộc về" Object (Trong Python, phương thức term cá thể Class: kiểu Object khác có phương thức Ví dụ, liệt kê Object có phương thức gọi chắp thêm, chèn, loại bỏ, xếp, vv Tuy nhiên, thảo luận sau, sử dụng phương thức thuật ngữ độc quyền để phương thức Object thể lợp,trừ quy định rõ ràng khác) Các tên phương thức hợp lệ Object thể phụ thuộc vào Class Theo định nghĩa, tất thuộc tính Class Object hàm xác định phương thức tương ứng cá thể nó.vì vậy,trong ví dụ chúng tơi, x.f tham chiếu phương thức hợp lệ, MyClass.f hàm, x.i khơng, MyClass.i khơng Nhưng x.f khơng giống với MyClass.f - Object phương thức, Object hàm 1.3.4 Method Objects Thông thường, phương thức gọi sau bị ràng buộc: x.f() Trong ví dụ MyClass, điều trả chuỗi 'hello world' Tuy nhiên, không cần phải gọi phương thức lập tức: x.f Object phương thức, cất giữ gọi sau đó.ví dụ: xf = x.f while True: print(xf()) tiếp tục in giới hello cuối thời gian What exactly happens when a method is called? You may have noticed that x.f() was called without an argument above, even though the function definition for f() specified an argument Điều xác xảy phương pháp gọi là? Bạn nhận thấy x.f () gọi mà khơng có đối số trên, định nghĩa hàm cho f () định đối số.điều xày với đối số? ? Chắc chắn Python đặt ngoại lệ hàm yêu cầu đối số gọi mà không cần - đối số không thực sử dụng… Trên thực tế, bạn đốn câu trả lời: điều đặc biệt phương thức Object thể chuyển đối số hàm Trong ví dụ chúng ta, hàm x.f () xác tương đương với MyClass.f(x) Nói chung, gọi phương thức với danh sách n đối số tương đương với việc gọi hàm tương ứng với danh sách đối số tạo cách chèn Object Object phương thức trước đối số Nếu bạn không hiểu phương thức hoạt động nào, việc xem xét triển khai làm rõ vấn đề Khi thuộc tính thể tham chiếu khơng phải thuộc tính liệu,Class tìm kím Nếu tên biểu thị Object hàm, , Object phương thức tạo cách đóng gói (con trỏ đến) Object thể Object hàm tìm thấy Object trừu tượng: Object phương thức.khi Object method gọi với danh sách tham số, , danh sách đối số xây dựng từ Object thể danh sách đối số, Object hàm gọi với danh sách đối số 1.3.5 Class and Instance Variables Nói chung, biến cá thể liệu cho biến thể Class cho thuộc tính phương thức chia sẻ tất cá thể Class: class Dog: kind = 'canine' all instances # class variable shared by def init (self, name): self.name = name # instance variable unique to each instance >>> d = Dog('Fido') >>> e = Dog('Buddy') >>> d.kind 'canine' >>> e.kind 'canine' >>> d.name 'Fido' >>> e.name 'Buddy' # shared by all dogs # shared by all dogs # unique to d # unique to e Như thảo luận A Word Giới thiệu Tên Object, liệu chia sẻ có tác dụng đáng ngạc nhiên với Object thay đổi danh sách từ điển Ví dụ, danh sách thủ thuật đoạn mã sau không nên sử dụng biến Class danh sách chia sẻ tất cá thể Dog: class Dog: tricks = [] variable # mistaken use of a class def init (self, name): self.name = name def add_trick(self, trick): self.tricks.append(trick) >>> d = Dog('Fido') >>> e = Dog('Buddy') >>> d.add_trick('roll over') >>> e.add_trick('play dead') >>> d.tricks # unexpectedly shared by all dogs ['roll over', 'play dead'] Thiết kế xác Class nên sử dụng mẫu thay đổi thay : class Dog: def init (self, name): self.name = name self.tricks = [] # creates a new empty list for each dog def add_trick(self, trick): self.tricks.append(trick) >>> d = Dog('Fido') >>> e = Dog('Buddy') >>> d.add_trick('roll over') >>> e.add_trick('play dead') >>> d.tricks ['roll over'] >>> e.tricks ['play dead'] 1.4 Random Remarks Thuộc tính liệu ghi đè thuộc tính phương thức có tên; để tránh xung đột tên ngẫu nhiên, điều gây lỗi khó tìm chương trình lớn, bạn nên sử dụng số loại quy ước để giảm thiểu hội xung đột Các quy ước bao gồm viết hoa tên phương thức, đặt tên cho thuộc tính liệu với chuỗi nhỏ (có lẽ dấu gạch dưới) sử dụng động từ cho phương pháp danh từ cho thuộc tính liệu Các thuộc tính liệu tham chiếu phương thức người dùng thông thường (“clients”) Object Nói cách khác, Class sử dụng để triền khai kiểu liệu trừu tượng túy.Trong thực tế,khong có Python làm cho thực thi ẩn liệu- tất dựa quy ước (Mặt khác, việc thực Python, viết C, hoàn toàn ẩn chi tiết thực kiểm soát quyền truy cập vào Object cần thiết;điều sử dụng phần mở rộng cho Python viết c) Khách hàng nên sử dụng thuộc tính liệu với quan tâm - khách hàng làm rối loạn bất biến trì phương thức cách dán lên thuộc tính liệu chúng Lưu ý khách hàng thêm thuộc tính liệu riêng vào Object thể mà khơng ảnh hưởng đến tính hợp lệ phương thức, miễn xung đột tên tránh – lần nữa,quy ước đặt tên tiết kiệm nhiều đau đầu Khơng có cách viết tắt để tham chiếu thuộc tính liệu (hoặc phương thức khác!) Từ bên phương thức Tôi thấy điều thực làm tăng khả đọc phương thức:khơng có khả gây nhầm lẫn biến cục biến mẫu lướt qua phương thức Thông thường, đối số phương thức gọi tự Đây khơng là quy ước: tên tự hồn tồn khơng có ý nghĩa đặc biệt Python Tuy nhiên, lưu ý cách không tuân thủ quy ước, mã bạn đọc lập trình viên Python khác, hiểu chương trình trình duyệt Class viết dựa quy ước Bất kỳ Object hàm thuộc tính Class định nghĩa phương thức cho cá thể Class Khơng cần thiết định nghĩa hàm bao bọc văn định nghĩa Class:gán Object hàm cho biến cục Class ok.ví dụ: # Function defined outside the class def f1(self, x, y): return min(x, x+y) class C: f = f1 def g(self): return 'hello world' h = g Bây f, g h tất thuộc tính Class C tham chiếu đến Object hàm, chúng tất phương thức cá thể C - h tương đương xác với g Lưu ý thực hành thường phục vụ để gây nhầm lẫn cho người đọc chương trình Methods may call other methods by using method attributes of the self argument: Các phương thức gọi phương thức khác cách sử dụng thuộc tính phương thức đối số tự: class Bag: def init (self): self.data = [] def add(self, x): self.data.append(x) def addtwice(self, x): self.add(x) self.add(x) Các phương thức tham chiếu đến tên tồn cầu theo cách với hàm bình thường Phạm vi tồn cầu liên kết với phương thức mơ-đun chứa định nghĩa (Một Class khơng sử dụng phạm vi toàn cầu.) Trong người gặp lý đáng để sử dụng liệu toàn cục phương thức, có nhiều cách sử dụng hợp pháp phạm vi tồn cục: điều, hàm mơ-đun nhập vào phạm vi tồn cục sử dụng phương thức, hàm Class định nghĩa Thơng thường, Class chứa phương thức xác định phạm vi tồn cục phần tiếp theo, tìm thấy số lý đáng phương thức muốn tham chiếu Class riêng Mỗi giá trị Object, có Class (còn gọi kiểu nó) Nó lưu trữ Object class 1.5 Inheritance Mỗi giá trị Object, có Class (còn gọi kiểu nó) Nó lưu trữ Object class class DerivedClassName(BaseClassName): Tên BaseClassName phải định nghĩa phạm vi chứa định nghĩa Class dẫn xuất Thay cho tên Class sở, biểu thức tùy ý khác cho phép Điều hữu ích, ví dụ, Class sở định nghĩa mô-đun khác: class DerivedClassName(modname.BaseClassName): Việc thực định nghĩa Class dẫn xuất giống Class sở Khi Object Class xây dựng, Class sở ghi nhớ Điều sử dụng để giải tham chiếu thuộc tính : khơng tìm thấy thuộc tính yêu cầu Class, tìm kiếm tiến hành tìm Class sở Quy tắc áp dụng đệ quy Class sở bắt nguồn từ số Class khác Khơng có đặc biệt việc khởi tạo Class dẫn xuất: DerivedClassName () tạo cá thể Class Các tham chiếu phương thức giải sau: thuộc tính Class tương ứng tìm kiếm , giảm dần chuỗi Class sở cần, tham chiếu phương thức hợp lệ điều tạo Object hàm Các Class có nguồn gốc ghi đè lên phương thức Class sở chúng Vì phương thức khơng có đặc quyền đặc biệt gọi phương thức khác Object, phương thức Class sở gọi phương thức khác định nghĩa Class sở kết thúc gọi phương thức Class dẫn xuất ghi đè (Đối với c lập trình viên C : tất phương thức Python có hiệu ảo.) Một phương thức ghi đè Class dẫn xuất thực muốn mở rộng thay đơn giản thay phương thức Class sở có tên Có cách đơn giản để gọi trực tiếp phương thức Class sở: cần gọi BaseClassName.methodname (tự, đối số) Điều hữu ích cho khách hàng tốt (Lưu ý điều hoạt động Class sở truy cập dạng BaseClassName phạm vi toàn cục ) Python có hai chức nội làm việc với di sản :  Sử dụng isinstance () để kiểm tra kiểu thể hiện: isinstance (obj, int) True obj class int số Class bắt nguồn từ int  Dùng issubclass () để kiểm tra thừa kế Class: issubclass (bool, int) True bool Class int Tuy nhiên, issubclass (float, int) False float khơng phải Class int 1.5.1 Multiple Inheritance Python hỗ trợ dạng đa thừa kế Một định nghĩa Class với nhiều Class sở trông giống sau: class DerivedClassName(Base1, Base2, Base3): Đối với hầu hết trường hợp, trường hợp đơn giản nhất, bạn nghĩ tìm kiếm thuộc tính kế thừa từ Class cha độ sâu đầu tiên, từ trái sang phải, khơng tìm kiếm hai lần Class có chồng chéo cấu trúc phân cấp Vì vậy, thuộc tính khơng tìm thấy DerivedClassName, tìm kiếm Base1, sau (đệ quy) Class sở Base1, khơng tìm thấy đó, đã tìm kiếm Base2, vv Trong thực tế, phức tạp thế; thứ tự độ phân giải phương thức thay đổi động để hỗ trợ gọi hợp tác đến super().Cách tiếp cận biết đến số ngôn ngữ đa thừa kế khác gọi phương thức mạnh so với siêu gọi tìm thấy ngôn ngữ kế thừa đơn Thứ tự động cần thiết tất trường hợp thừa kế nhiều thể nhiều mối quan hệ kim cương (nơi Class cha truy cập thơng qua nhiều đường dẫn từ Class cùng) Ví dụ, tất Class kế thừa từ Object, trường hợp thừa kế cung cấp nhiều đường dẫn để tiếp cận Object Để giữ cho Class sở không bị truy cập nhiều lần, thuật tốn động tuyến tính thứ tự tìm kiếm theo cách giữ nguyên thứ tự từ trái sang phải định Class, gọi cha mẹ lần đơn điệu (nghĩa Class phân Class mà khơng ảnh hưởng đến thứ tự ưu tiên cha mẹ nó) Kết hợp với nhau, thuộc tính làm cho thiết kế Class đáng tin cậy mở rộng với nhiều thừa kế Để biết thêm chi tiết, xem https://www.python.org/download/releases/2.3/mro/ 1.6 Private Variables Các biến cá thể "riêng tư" truy cập trừ bên Object không tồn Python Tuy nhiên, có quy ước theo sau hầu hết mã Python: tên đặt trước dấu gạch (ví dụ: _spam) phải coi phần khơng cơng khai API (cho dù hàm, phương thức hay thành viên liệu) Nó phải coi chi tiết thực thay đổi mà khơng cần thơng báo Vì có trường hợp sử dụng hợp lệ cho thành viên private-class (cụ thể để tránh xung đột tên tên với tên xác định Class con), có hỗ trợ hạn chế cho chế vậy, gọi mangling name Bất kỳ số nhận dạng biểu mẫu spam (ít hai dấu gạch hàng đầu, tối đa dấu gạch sau) thay văn _classname spam, classname tên Class với dấu gạch hàng đầu bị tước Việc xén thực mà khơng quan tâm đến vị trí cú pháp mã định danh, miễn xảy định nghĩa Class Tên mangling hữu ích cho phép Class ghi đè lên phương thức mà không phá vỡ lời gọi phương thức intraclass Ví dụ: class Mapping: def init (self, iterable): self.items_list = [] self. update(iterable) def update(self, iterable): for item in iterable: self.items_list.append(item) update = update update() method # private copy of original class MappingSubclass(Mapping): def update(self, keys, values): # provides new signature for update() # but does not break init () for item in zip(keys, values): self.items_list.append(item) Lưu ý quy tắc mangling thiết kế chủ yếu để tránh tai nạn; truy cập sửa đổi biến coi riêng tư Điều chí hữu ích trường hợp đặc biệt ,chẳng hạn trình gỡ lỗi Lưu ý mã chuyển tới exec () eval () không xem xét tên Class Class gọi Class tại; điều tương tự ảnh hưởng câu lệnh chung, hiệu ứng bị hạn chế mã biên dịch byte Các hạn chế tương tự áp dụng cho getattr (), setattr () delattr (), tham chiếu dict trực tiếp 1.7 Odds and Ends Đơi hữu ích để có kiểu liệu tương tự "bản ghi" Pascal C "struct", bó lại với vài mục liệu có tên Một định nghĩa Class trống làm độc đáo: class Employee: pass john = Employee() # Create an empty employee record # Fill the fields of the record john.name = 'John Doe' john.dept = 'computer lab' john.salary = 1000 Một đoạn mã Python dự kiến loại liệu trừu tượng cụ thể thường chuyển qua Class mơ phương thức kiểu liệu thay Ví dụ, bạn có hàm định dạng số liệu từ Object tập tin bạn định nghĩa Class với phương thức read () readline () để lấy liệu từ đệm chuỗi thay vào đó, chuyển thành đối số Các Object phương thức instance có thuộc tính: m self Object instance với phương thức m () m func Object hàm tương ứng với phương thức 1.8 Iterators : Bây bạn nhận thấy hầu hết Object container lặp lại cách sử dụng câu lệnh for for element in [1, 2, 3]: print(element) for element in (1, 2, 3): print(element) for key in {'one':1, 'two':2}: print(key) for char in "123": print(char) for line in open("myfile.txt"): print(line, end='') Kiểu truy cập rõ ràng, ngắn gọn thuận tiện Việc sử dụng trình vòng lặp tràn lan hợp Python Phía sau hậu trường, câu lệnh for gọi iter () Object container Hàm trả Object iterator định nghĩa phương thức next () để truy cập phần tử vùng chứa lần Khi khơng yếu tố , next () đặt ngoại lệ StopIteration để báo cho vòng lặp for chấm dứt Bạn gọi phương thức next () hàm dựng sẵn (); ví dụ cho thấy hoạt động nào: >>> >>> s = 'abc' >>> it = iter(s) >>> it >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) Traceback (most recent call last): File "", line 1, in next(it) StopIteration Sau nhìn thấy chế đằng sau giao thức lặp, dễ dàng để thêm hành vi trình lặp vào Class bạn Xác định phương thức iter () trả Object với phương thức trả Object với phương thức next () Nếu Class định nghĩa next (), iter () trả tự: class Reverse: """Iterator for looping over a sequence backwards.""" def init (self, data): self.data = data self.index = len(data) def iter (self): return self def next (self): if self.index == 0: raise StopIteration self.index = self.index - return self.data[self.index] >>> >>> rev = Reverse('spam') >>> iter(rev) < main .Reverse object at 0x00A1DB50> >>> for char in rev: print(char) m a p s 1.1 Generators Generators công cụ đơn giản mạnh mẽ để tạo trình lặp Chúng viết giống hàm thông thường sử dụng câu lệnh yield chúng muốn trả liệu Mỗi lần next () gọi nó, máy phát lại tiếp tục lại def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] >>> >>> for char in reverse('golf'): print(char) f l o g Bất điều thực với máy phát thực với trình vòng lặp dựa Class mô tả phần trước Điều làm cho máy phát nhỏ gọn đến mức phương thức iter () next () tạo tự động Một tính quan trọng khác biến cục trạng thái thực thi lưu tự động gọi Điều làm cho hàm dễ viết rõ ràng nhiều so với cách tiếp cận sử dụng biến mẫu self.index self.data Ngoài việc tạo phương thức tự động lưu trạng thái chương trình, máy phát điện chấm dứt, chúng tự động tăng StopIteration Kết hợp, tính giúp dễ dàng tạo trình vòng lặp mà khơng cần nỗ lực nhiều viết hàm thông thường 1.10 Generator Expressions Một số trình tạo đơn giản mã hóa gọn gàng biểu thức cách sử dụng cú pháp tương tự việc hiểu danh sách với dấu ngoặc đơn thay dấu ngoặc vuông Các biểu thức thiết kế cho tình mà máy phát điện sử dụng hàm kèm theo Biểu thức máy phát điện nhỏ gọn linh hoạt so với định nghĩa máy phát điện đầy đủ có xu hướng thân thiện với nhớ so với việc hiểu danh sách tương đương Ví dụ >>> >>> sum(i*i for i in range(10)) of squares 285 >>> xvec = [10, 20, 30] >>> yvec = [7, 5, 3] >>> sum(x*y for x,y in zip(xvec, yvec)) product 260 # sum # dot >>> from math import pi, sin >>> sine_table = {x: sin(x*pi/180) for x in range(0, 11)} >>> unique_words = set(word in line.split()) for line in page for word >>> valedictorian = max((student.gpa, student.name) for student in graduates) >>> data = 'golf' >>> list(data[i] for i in range(len(data)-1, -1, -1)) ['f', 'l', 'o', 'g'] ... phạm vi Python Định nghĩa Class phát số thủ thuật gọn gàng với không gian tên bạn cần biết cách phạm vi không gian hoạt động để hiểu đầy đủ diễn Ngẫu nhiên, kiến thức chủ đề hữu ích cho lập trình... đề hữu ích cho lập trình viên Python tiên tiến bắt đầu số định nghĩa Một không gian tên ánh xạ từ tên đến Object Hầu hết không gian tên triển khai dạng từ điển Python, thường không đáng ý theo... ước để giảm thiểu hội xung đột Các quy ước bao gồm viết hoa tên phương thức, đặt tên cho thuộc tính liệu với chuỗi nhỏ (có lẽ dấu gạch dưới) sử dụng động từ cho phương pháp danh từ cho thuộc tính

Ngày đăng: 16/06/2018, 23:39

Từ khóa liên quan

Mục lục

  • 1. Classes

    • 1.1. Vấn đề về Names và Object

    • Các Object có tính cá nhân và nhiều tên (trong nhiều phạm vi) có thể bị ràng buộc vào cùng một Object. Điều này được gọi là răng cưa trong các ngôn ngữ khác. Điều này thường không được đánh giá cao trên một cái nhìn đầu tiên tại Python, và có thể được bỏ qua một cách an toàn khi giao dịch với các loại cơ bản không thay đổi (số, chuỗi, bộ dữ liệu). Tuy nhiên, răng cưa có tác dụng đáng ngạc nhiên đối với ngữ nghĩa của mã Python liên quan đến các Object có thể thay đổi được như danh sách, từ điển và hầu hết các loại khác. Điều này thường được sử dụng vì lợi ích của các chương trình ,vì bí danh hoạt động như con trỏ ở một số khía cạnh. . Ví dụ, việc truyền một Object là rẻ vì chỉ có một con trỏ được thực thi; và nếu một hàm sửa đổi một Object được truyền vào như một đối số, người gọi sẽ thấy sự thay đổi-điều này loại bỏ sự cần thiết của hai cơ chế truyền tham số khác nhau như trong pascal.

    • 1.2. Python phạm vi và khoảng tên trống

      • 1.2.1. Phạm vi và khoảng tên trống ví dụ

      • 1.3. A First Look at Classes

        • 1.3.1. Class Definition Syntax

        • 1.3.2. Class Objects

        • 1.3.3. Instance Objects

        • 1.3.4. Method Objects

        • 1.3.5. Class and Instance Variables

        • 1.4. Random Remarks

        • 1.5. Inheritance

          • 1.5.1. Multiple Inheritance

          • 1.6. Private Variables

          • 1.7. Odds and Ends

          • 1.8. Iterators

          • 1.1. Generators

          • 1.10. Generator Expressions

Tài liệu cùng người dùng

Tài liệu liên quan