2017-04-03 18 views
8

Tôi có thể gán giá trị cho một biến trong mô-đun không. Nếu có, sự khác biệt giữa một lớp và mô-đun là gì.Sự khác biệt giữa Mô-đun và Lớp trong Python

PS: Tôi là một anh chàng java. Trong trường hợp nếu nó giúp trong cách giải thích. Cảm ơn.

+0

Trong module Python, các lớp học, meta-lớp học, vv là ** tất cả các đối tượng ** là tốt. Bạn có thể đặt các đối số của một mô-đun. Sự khác biệt là một lớp được định hình theo một cách đặc biệt với một '__init__', v.v. –

+0

Vâng, sự khác biệt đầu tiên khá rõ ràng: module == tệp, class == một phần của một tệp. Tuy nhiên, trong Java, mọi người có xu hướng (hay nói là buộc phải) có một lớp cho mỗi cấu trúc tệp. Nếu không, bạn có thể làm điều này: 'thời gian nhập; time.my_variable = 1' và bạn có thể sử dụng nó sau đó trong phạm vi. – KeyWeeUsr

+4

Bạn không thể tạo các phiên bản của một mô-đun. Các module là * singletons *, chỉ tồn tại một bản sao. Bạn có thể tạo các cá thể của các lớp khác. Đây là * không khác nhau trong Java *. Các lớp hỗ trợ kế thừa, các mô-đun không. Các lớp học hỗ trợ metaclasses, module không. Các lớp học hỗ trợ các mô tả, các mô-đun thì không. –

Trả lời

9
  • Mô-đun:

    Module là một tập tin có chứa các định nghĩa Python và báo cáo.

Khi doc nói.

Vì vậy, một mô-đun trong python chỉ đơn giản là một cách để tổ chức mã, và nó chứa các lớp python hoặc chỉ các hàm. Nếu bạn cần các lớp hoặc chức năng đó trong dự án của mình, bạn chỉ cần import chúng. Ví dụ: Ví dụ, mô-đun math trong python chỉ chứa một loạt hàm và bạn chỉ cần gọi những chức năng đó (math.sin). Chỉ cần xem question này.

Mặt khác, một lớp python tương tự như một lớp java, nó chỉ được cấu trúc theo một cách hơi khác.

5

lớn sự khác biệt giữa các lớp và mô-đun bằng Python.

Lớp học là các bản thiết kế cho phép bạn tạo các phiên bản có thuộc tính và chức năng bị ràng buộc. Các lớp học hỗ trợ kế thừa, metaclasses và descriptor.

Modules không thể làm bất cứ điều này, mô-đun cơ bản trường singleton của một lớp học nội module, và tất cả các globals của họ là các thuộc tính trên module dụ. Bạn có thể thao tác các thuộc tính đó khi cần thiết (thêm, loại bỏ và cập nhật), nhưng phải tính đến việc chúng vẫn tạo thành không gian tên chung cho tất cả các mã được định nghĩa trong mô-đun đó.

Từ góc độ Java, các lớp không khác biệt ở đây. Tuy nhiên, các mô-đun có thể chứa nhiều hơn một lớp; các hàm và bất kỳ kết quả nào của bất kỳ biểu thức Python nào khác cũng có thể là các hình cầu trong một mô-đun.

Vì vậy, như một phương châm sân chơi bóng chày chung:

  • Sử dụng các lớp học như bản thiết kế cho các đối tượng mà mô hình miền vấn đề của bạn.
  • Sử dụng các mô-đun để thu thập chức năng thành các đơn vị logic.

Sau đó lưu trữ dữ liệu phù hợp với ứng dụng của bạn. Trạng thái toàn cầu đi vào các mô-đun (và các hàm và các lớp cũng giống như trạng thái toàn cục, được nạp ngay từ đầu). Mọi thứ khác đi vào các cấu trúc dữ liệu khác, bao gồm cả các thể hiện của các lớp.

0

Tôi có thể gán giá trị cho biến trong mô-đun không?
Trong ngắn hạn có.


Khái niệm về module đề cập đến một tập tin Python duy nhất mà có thể được nhập khẩu (bằng cách nhập, bạn có quyền truy cập vào các biến/phương pháp/lớp được định nghĩa trong mô-đun đó).

Nó thường được thảo luận cùng với khái niệm package, là một thư mục có __init__.py. Một gói có thể chứa các gói con hoặc các mô-đun, và cùng một lúc, tương tự như các mô-đun, có thể định nghĩa các biến/phương thức/lớp được nhập vào bên trong của nó __init__.py.

Mục đích của việc có các mô-đun/gói trong Python là loại tương tự như có các gói trong Java: để chứa và phân loại các mã có thể sử dụng lại, để giải quyết xung đột tên và vv.


Bên cạnh đó, Python cũng có một lớp được xây dựng trong tên module, giống như list, tuple, dict (lưu ý rằng Python lớp được xây dựng trong không tuân theo các quy ước đặt tên CapWords do nguyên nhân di sản). Phiên bản module thể hiện mô đun/gói được nhập.

Khi bạn sử dụng câu lệnh import để nhập khẩu một module (file Python đơn) hoặc một gói (thư mục với __init__.py), thường
1. một trường hợp mới của module lớp sẽ được tạo
2. các lớp/phương pháp/biến bạn đã xác định trong tệp Python đã nhập đó sẽ được thêm làm thuộc tính của cá thể module này (nếu là gói, nó sẽ là các lớp/phương thức/biến được xác định trong __init__.py được thêm vào).

Vì vậy, vì nó chỉ là một thể hiện của lớp module, bạn có thể gán giá trị cho thuộc tính của cá thể đó và các hoạt động thể hiện lớp khác.

import math 

print(type([1,2,3])) 
print(type(math)) 
print(dir([1,2,3])) 
print(dir(math)) 

console:

<class 'list'> 
<class 'module'> 
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] 
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc'] 
Các vấn đề liên quan