Lớp với Đối tượng làm tham số


114

Tôi đang cố dịch một số mã python sang mã scala. Vì vậy, tôi hoàn toàn là một noob trong Python.

Nhưng tại sao một số lớp có đối tượng là một tham số nhưng không bao giờ sử dụng nó một cách rõ ràng? Lý do để có nó như một tham số ngay từ đầu là gì?

Thí dụ:

class Table(object)

Cảm ơn bạn đã dành thời gian.


Câu trả lời:


112

Trong Python2, điều này tuyên bố Tablelà một lớp kiểu mới (trái ngược với lớp "cổ điển"). Trong Python3, tất cả các lớp đều là các lớp kiểu mới, vì vậy điều này không còn cần thiết nữa.

Các lớp kiểu mới có một vài thuộc tính đặc biệt mà các lớp cổ điển thiếu.

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Ngoài ra, thuộc tínhsiêu không hoạt động với các lớp cổ điển.

Trong Python2, bạn nên tạo tất cả các lớp là các lớp kiểu mới. (Mặc dù nhiều lớp trong thư viện chuẩn vẫn là các lớp cổ điển, vì lợi ích tương thích ngược.)

Nói chung, trong một tuyên bố chẳng hạn như

class Foo(Base1, Base2):

Foođang được khai báo là một lớp kế thừa từ các lớp cơ sở Base1Base2.

objectlà mẹ của tất cả các lớp trong Python. Nó là một lớp kiểu mới, vì vậy kế thừa từ objecttạo nên Tablemột lớp kiểu mới.


bạn có thể chuyển hướng tôi đến một nguồn có đề cập đến đối tượng không cần thiết là tham số trong Python3 không? Tôi dường như không thể tìm thấy nó. Cảm ơn bạn
Snow

1
Nó đã được đề cập nhiều lần trên StackOverflow ( ví dụ: ở đây ), nhưng tôi không thể tìm thấy một khai báo đơn giản về điều này trong tài liệu. Nó được hiển thị ngầm (bằng cách bỏ qua objectdanh sách các cơ sở lớp) trong hướng dẫn .
unutbu

1
Các tài liệu Python3 cũng nói rằng "lớp kiểu mới" là "tên cũ cho hương vị của các lớp hiện được sử dụng cho tất cả các đối tượng lớp " (tôi nhấn mạnh). Và tài liệu Python2 nói rằng "lớp kiểu mới" là bất kỳ lớp nào kế thừa từ đó object. Hai câu lệnh kết hợp với nhau ngụ ý rằng bạn không cần phải đưa objectvào danh sách các cơ sở lớp trong Python3 vì tất cả các lớp đều là các lớp kiểu mới trong Python3.
unutbu

21

Các Tablelớp được mở rộng một lớp được gọi là object. Nó không phải là một cuộc tranh cãi. Lý do bạn có thể muốn mở rộng objectrõ ràng là nó biến lớp thành một lớp kiểu mới. Nếu bạn không chỉ định rõ ràng nó sẽ mở rộng object, cho đến Python 3, nó sẽ mặc định là một lớp kiểu cũ. (Kể từ Python 3, tất cả các lớp đều là kiểu mới, cho dù bạn có mở rộng rõ ràng objecthay không.)

Để biết thêm thông tin về các lớp học kiểu mới và kiểu cũ, vui lòng xem câu hỏi này .


1
Đây là câu trả lời đơn giản và ngắn gọn hơn. Cảm ơn.
Sabuncu

3

Chỉ cần lưu ý rằng sự khác biệt giữa lớp “kiểu mới” và lớp “kiểu cũ” dành riêng cho Python 2.x; trong 3.x, tất cả các lớp đều là “kiểu mới”.


2

class Table và class Table (đối tượng) không khác gì đối với Python.

Nó không phải là một tham số, nó mở rộng từ đối tượng (là Lớp cơ sở giống như nhiều ngôn ngữ khác).

Tất cả những gì nó nói là nó kế thừa bất cứ thứ gì được định nghĩa trong "object". Đây là hành vi mặc định.


3
Các lớp tự động mở rộng objectlà hành vi mặc định chỉ trong Python 3. Trong python 2, một đối tượng mở rộng lớp có các thuộc tính mà một lớp không mở rộng đối tượng sẽ không có.
Lewis Ellis

1

đối tượng là kiểu cơ sở nhất của đối tượng lớp được định nghĩa trong python. Các thuộc tính của đối tượng có thể được xem như bên dưới

** >>> dir (đối tượng)

[' class ', ' delattr ', ' doc ', ' format ', ' getattribute ', ' hash ', ' init ', ' new ', ' Reduce ', ' Reduce_ex ', ' repr ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

Vì vậy Table (object) chỉ là kế thừa.!


0

1) Tên lớp (đối tượng): 2) Tên lớp: Cả hai đều giống nhau nhưng cái đầu tiên là khá hơn về cách viết, nó trông đẹp hơn trong khi kế thừa các lớp khác sang lớp khác, nó trông đồng nhất.

Giống nhau như thế nào? Vì vậy, mọi thứ trong Python đều thuộc đối tượng có nghĩa là mọi thứ trong Python đều có thuộc tính của đối tượng, nếu viết hay không viết nó sẽ hiểu nó. Đầu tiên, chúng tôi nói rõ ràng rằng sau đó chúng tôi không nói.


Đây không phải là trường hợp trong Python 2, hãy xem câu trả lời được chấp nhận để biết chi tiết.
niemmi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.