Hướng dẫn python declare instance variable type - python khai báo kiểu biến cá thể
Tôi sẽ khuyên bạn nên sử dụng phiên bản đầu tiên, nơi bạn gán các loại cho các tham số của phương thức path = None # type: Optional[str] # Path to module source4, trong hầu hết các trường hợp. Show
Phương pháp cụ thể đó có số lượng dự phòng ít nhất trong khi vẫn cho phép trình kiểm tra loại xác minh rằng bạn đang gọi phương thức path = None # type: Optional[str] # Path to module source4 đó một cách chính xác ở nơi khác trong mã của bạn. Tôi sẽ khuyên bạn nên sử dụng phiên bản thứ hai hoặc thứ ba, trong đó bạn chú thích rõ ràng các trường của mình (bên trong hoặc bên ngoài path = None # type: Optional[str] # Path to module source4) khi phương thức path = None # type: Optional[str] # Path to module source4 của bạn đã phát triển đủ phức tạp đến mức áp dụng một hoặc nhiều điều sau đây:
Tuy nhiên, không rõ tôi là phiên bản thứ hai hay thứ ba được ưa thích - cá nhân tôi thích phiên bản thứ ba vì nó sạch hơn về mặt khái niệm và dường như không kết hợp khái niệm về thể hiện so với các thuộc tính của lớp, nhưng tôi không thể phủ nhận Phiên bản thứ hai trông sạch hơn. Tôi đã hỏi về nó trên kênh Gitter 'gõ' và nhận được phản hồi sau từ Guido (người, trên cơ hội mà bạn không biết, đã tạo Python và hiện đang làm việc trên MyPy và gõ các thứ liên quan):
(liên kết đến báo giá) Vì vậy, có vẻ như phiên bản thứ hai được khuyến nghị trong phiên bản thứ ba và việc xác định các lớp theo cách đó sẽ được tích hợp sâu hơn vào chính ngôn ngữ Python tại một số điểm trong tương lai! EDIT: PEP 557, các lớp dữ liệu gần đây đã được chấp nhận và dường như được theo dõi (?) Để được bao gồm với Python 3.7. PEP 557, data classes was recently accepted and appears to be on-track (?) to be included with Python 3.7.
Trạng tháiThông báo cho người đánh giá Thông báo cho người đánh giátrừu tượng Cơ sở lý luận Sự chỉ rõ trừu tượngCơ sở lý luận # 'primes' is a list of integers primes = [] # type: List[int] # 'captain' is a string (Note: initial value is a problem) captain = ... # type: str class Starship: # 'stats' is a class variable stats = {} # type: Dict[str, int] Sự chỉ rõ primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {} Chú thích biến toàn cầu và địa phương Cơ sở lý luậnSự chỉ rõ
Phần lớn các vấn đề này có thể được giảm bớt bằng cách biến cú pháp thành một phần cốt lõi của ngôn ngữ. Hơn nữa, có một cú pháp chú thích chuyên dụng cho các biến lớp và trường hợp (ngoài các chú thích phương pháp) sẽ mở đường cho việc gõ vịt tĩnh như một bổ sung để gõ danh nghĩa được xác định bởi PEP 484. Non-goalsMặc dù đề xuất đi kèm với phần mở rộng của chức năng thư viện tiêu chuẩn my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.2 để truy xuất các chú thích thời gian chạy, các chú thích biến không được thiết kế để kiểm tra loại thời gian chạy. Các gói của bên thứ ba sẽ phải được phát triển để thực hiện chức năng đó. Cũng cần nhấn mạnh rằng Python sẽ vẫn là một ngôn ngữ được đánh máy động và các tác giả không muốn làm cho các gợi ý loại bắt buộc, ngay cả theo quy ước. Loại chú thích không nên bị nhầm lẫn với các khai báo biến trong các ngôn ngữ được đánh máy tĩnh. Mục tiêu của cú pháp chú thích là cung cấp một cách dễ dàng để chỉ định siêu dữ liệu loại có cấu trúc cho các công cụ của bên thứ ba.Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention. Type annotations should not be confused with variable declarations in statically typed languages. The goal of annotation syntax is to provide an easy way to specify structured type metadata for third party tools. PEP này không yêu cầu trình kiểm tra loại để thay đổi quy tắc kiểm tra loại của họ. Nó chỉ cung cấp một cú pháp dễ đọc hơn để thay thế các bình luận loại. Sự chỉ rõLoại chú thích có thể được thêm vào một câu lệnh gán hoặc vào một biểu thức duy nhất cho biết loại mục tiêu chú thích mong muốn cho trình kiểm tra loại bên thứ ba: my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime. Cú pháp này không giới thiệu bất kỳ ngữ nghĩa mới nào ngoài PEP 484, do đó ba câu sau là tương đương: var = value # type: annotation var: annotation; var = value var: annotation = value Dưới đây chúng tôi chỉ định cú pháp của các chú thích loại trong các bối cảnh khác nhau và hiệu ứng thời gian chạy của chúng. Chúng tôi cũng đề xuất làm thế nào trình kiểm tra loại có thể giải thích các chú thích, nhưng việc tuân thủ các đề xuất này là không bắt buộc. (Điều này phù hợp với thái độ tuân thủ trong PEP 484.) Chú thích biến toàn cầu và địa phươngCác loại người dân địa phương và toàn cầu có thể được chú thích như sau: some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value Có thể bỏ qua giá trị ban đầu cho phép gõ các biến dễ dàng hơn được gán trong các nhánh có điều kiện: sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False Lưu ý rằng, mặc dù cú pháp không cho phép đóng gói tple, nhưng nó không cho phép người ta chú thích các loại biến khi sử dụng việc giải nén tuple: # Tuple packing with variable annotation syntax t: Tuple[int, ...] = (1, 2, 3) # or t: Tuple[int, ...] = 1, 2, 3 # This only works in Python 3.8+ # Tuple unpacking with variable annotation syntax header: str kind: int body: Optional[List[str]] header, kind, body = message Bỏ qua giá trị ban đầu để lại biến không chính xác: a: int print(a) # raises NameError Tuy nhiên, việc chú thích một biến cục bộ sẽ khiến thông dịch viên luôn biến nó thành một địa phương: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}0 Như thể mã là: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}1 Chú thích loại trùng lặp sẽ bị bỏ qua. Tuy nhiên, trình kiểm tra loại tĩnh có thể đưa ra cảnh báo cho các chú thích của cùng một biến theo một loại khác: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}2 Chú thích biến lớp và phiên bảnCác chú thích loại cũng có thể được sử dụng để chú thích các biến lớp và thể hiện trong các cơ quan và phương pháp lớp. Cụ thể, ký hiệu không có giá trị my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.3 cho phép người ta chú thích các biến thể hiện nên được khởi tạo trong my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.4 hoặc my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.5. Cú pháp được đề xuất như sau: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}3 Ở đây my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.6 là một lớp đặc biệt được xác định bởi mô -đun gõ cho biết trình kiểm tra loại tĩnh rằng biến này không nên được đặt trên các trường hợp. Lưu ý rằng tham số my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.6 không thể bao gồm bất kỳ biến loại nào, bất kể mức độ lồng nhau: my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.8 và my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.9 đều không hợp lệ nếu var = value # type: annotation var: annotation; var = value var: annotation = value0 là biến loại. Điều này có thể được minh họa với một ví dụ chi tiết hơn. Trong lớp học này: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}4 var = value # type: annotation var: annotation; var = value var: annotation = value1 được dự định là một biến lớp (theo dõi nhiều số liệu thống kê trên mỗi trò chơi khác nhau), trong khi var = value # type: annotation var: annotation; var = value var: annotation = value2 là một biến thể hiện với giá trị mặc định được đặt trong lớp. Sự khác biệt này có thể không được nhìn thấy bởi một trình kiểm tra loại: cả hai đều được khởi tạo trong lớp, nhưng var = value # type: annotation var: annotation; var = value var: annotation = value2 chỉ đóng vai trò là giá trị mặc định thuận tiện cho biến thể hiện, trong khi var = value # type: annotation var: annotation; var = value var: annotation = value1 thực sự là một biến lớp - nó được dự định sẽ được chia sẻ bởi tất cả các trường hợp. Vì cả hai biến xảy ra được khởi tạo ở cấp độ lớp, nên rất hữu ích khi phân biệt chúng bằng cách đánh dấu các biến lớp là chú thích với các loại được bọc trong var = value # type: annotation var: annotation; var = value var: annotation = value5. Theo cách này, một trình kiểm tra loại có thể gắn cờ các bài tập tình cờ vào các thuộc tính có cùng tên trên các trường hợp. Ví dụ, chú thích lớp đã thảo luận: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}5 Như một vấn đề thuận tiện (và quy ước), các biến thể hiện có thể được chú thích trong my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.4 hoặc các phương thức khác, thay vì trong lớp: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}6 Chú thích biểu thứcMục tiêu của chú thích có thể là bất kỳ mục tiêu gán duy nhất hợp lệ nào, ít nhất là về mặt cú pháp (tùy thuộc vào kiểu kiểm tra loại phải làm gì với điều này): primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}7 Lưu ý rằng ngay cả một tên ngoặc cũng được coi là một biểu thức, không phải là một tên đơn giản: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}8 Nơi chú thích aren cho phépViệc cố gắng chú thích các biến theo var = value # type: annotation var: annotation; var = value var: annotation = value7 hoặc var = value # type: annotation var: annotation; var = value var: annotation = value8 là bất hợp pháp trong cùng một phạm vi chức năng: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}9 Lý do là các biến riêng của var = value # type: annotation var: annotation; var = value var: annotation = value7 và var = value # type: annotation var: annotation; var = value var: annotation = value8 don don; Do đó, các chú thích loại thuộc về phạm vi sở hữu biến. Chỉ được phép cho phép các mục tiêu gán đơn và các giá trị bên tay phải duy nhất được cho phép. Ngoài ra, người ta không thể chú thích các biến được sử dụng trong câu lệnh some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value1 hoặc some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value2; Chúng có thể được chú thích trước thời hạn, theo cách tương tự như giải nén: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?0 Chú thích biến trong các tệp sơ khaiVì các chú thích thay đổi dễ đọc hơn các bình luận loại, chúng được ưa thích trong các tệp sơ khai cho tất cả các phiên bản của Python, bao gồm Python 2.7. Lưu ý rằng các tệp sơ khai không được thực thi bởi các phiên dịch viên Python và do đó sử dụng các chú thích thay đổi sẽ không dẫn đến lỗi. Kiểu kiểm tra loại nên hỗ trợ các chú thích thay đổi trong các cuống cho tất cả các phiên bản của Python. Ví dụ: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?1 Kiểu mã hóa ưa thích cho các chú thích thay đổiChú thích cho các biến cấp mô -đun, các biến lớp và thể hiện và các biến cục bộ phải có một không gian duy nhất sau khi đại tràng tương ứng. Không nên có không gian trước đại tràng. Nếu một nhiệm vụ có phía bên tay phải, thì dấu hiệu bình đẳng sẽ có chính xác một khoảng trống ở cả hai bên. Ví dụ:
Thay đổi đối với thư viện và tài liệu tiêu chuẩn
Hiệu ứng thời gian chạy của các chú thích loạiChú thích một biến cục bộ sẽ khiến thông dịch viên coi nó như một địa phương, ngay cả khi nó không bao giờ được chỉ định. Chú thích cho các biến cục bộ sẽ không được đánh giá: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?4 Tuy nhiên, nếu nó ở cấp độ mô -đun hoặc lớp, thì loại sẽ được đánh giá: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?5 Ngoài ra, ở cấp độ mô -đun hoặc lớp, nếu mục được chú thích là một cái tên đơn giản, thì nó và chú thích sẽ được lưu trữ trong thuộc tính sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False0 của mô -đun hoặc lớp (bị xáo trộn nếu riêng tư) như một bản đồ được đặt hàng từ tên để đánh giá Chú thích. Đây là một ví dụ: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?6 sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False0 có thể ghi, vì vậy điều này được cho phép: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?7 Nhưng việc cố gắng cập nhật sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False0 lên một cái gì đó khác ngoài ánh xạ được đặt hàng có thể dẫn đến một kiểu mẫu: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?8 . Cách khuyến nghị để nhận được các chú thích trong thời gian chạy là sử dụng hàm my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.2; Như với tất cả các thuộc tính Dunder, bất kỳ việc sử dụng sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False0 không bị phá vỡ mà không bị cảnh báo: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?9 Lưu ý rằng nếu các chú thích không được tìm thấy thống kê, thì từ điển sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False0 hoàn toàn không được tạo ra. Ngoài ra, giá trị của việc có các chú thích có sẵn tại địa phương không bù đắp chi phí phải tạo và điền từ điển chú thích trên mỗi cuộc gọi chức năng. Do đó, các chú thích ở cấp độ chức năng không được đánh giá và không được lưu trữ. Các công dụng khác của chú thíchTrong khi Python với PEP này sẽ không phản đối: path = None # type: Optional[str] # Path to module source0 Vì nó sẽ không quan tâm đến việc chú thích loại ngoài phạm vi đánh giá mà không cần nâng cao, một trình kiểm tra loại gặp phải nó sẽ gắn cờ nó, trừ khi bị vô hiệu hóa với sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False8 hoặc sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False9. Tuy nhiên, vì Python đã giành được sự chăm sóc của loại hình này là gì, nếu đoạn trích ở trên ở cấp độ toàn cầu hoặc trong một lớp, sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False0 sẽ bao gồm # Tuple packing with variable annotation syntax t: Tuple[int, ...] = (1, 2, 3) # or t: Tuple[int, ...] = 1, 2, 3 # This only works in Python 3.8+ # Tuple unpacking with variable annotation syntax header: str kind: int body: Optional[List[str]] header, kind, body = message1. Những chú thích được lưu trữ này có thể được sử dụng cho các mục đích khác, nhưng với PEP này, chúng tôi đề xuất rõ ràng gợi ý loại là việc sử dụng các chú thích ưa thích. Các đề xuất bị từ chối/hoãn lại
Khả năng tương thích ngượcPEP này hoàn toàn tương thích ngược. Thực hiệnMột triển khai cho Python 3.6 được tìm thấy trên github repo tại https://github.com/ilevkivskyi/cpython/tree/pep-526 Bản quyềnTài liệu này đã được đặt trong phạm vi công cộng. Làm cách nào để đặt một biến thể hiện trong Python?Chúng ta có thể truy cập biến thể hiện bằng toán tử đối tượng và dấu chấm (.). Trong Python, để làm việc với một biến thể hiện và phương thức, chúng tôi sử dụng từ khóa tự. Chúng tôi sử dụng từ khóa tự làm tham số đầu tiên cho một phương thức.using the object and dot ( . ) operator. In Python, to work with an instance variable and method, we use the self keyword. We use the self keyword as the first parameter to a method.
Làm thế nào để bạn khai báo các biến các biến các biến?Một biến thể hiện có thể được khai báo bằng cách sử dụng các bộ sửa đổi truy cập khác nhau có sẵn trong Java như mặc định, riêng tư, công khai và được bảo vệ.Các biến thể hiện của các loại khác nhau có các giá trị mặc định được chỉ định trong điểm tiếp theo.using different access modifiers available in Java like default, private, public, and protected. Instance variables of different types have default values that are specified in the next point.
Có bao nhiêu loại biến thể hiện trong Python?Có hai loại chính: các biến lớp, có cùng giá trị trên tất cả các phiên bản lớp (nghĩa là các biến tĩnh) và các biến thể hiện, có các giá trị khác nhau cho từng thể hiện đối tượng.instance variables, which have different values for each object instance.
Python có biến thể hiện không?Bản tóm tắt.Các biến thể hiện được liên kết với một thể hiện cụ thể của một lớp.Python lưu trữ các biến thể hiện trong thuộc tính __dict__ của trường hợp.Mỗi trường hợp có thuộc tính __dict__ riêng và các khóa trong __dict__ này có thể khác nhau. |