2012-04-11 68 views
7

Mọi lớp trong trăn kế thừa từ đối tượng của lớp '. Tôi tự hỏi về cơ chế nội bộ của việc thực hiện lớp 'đối tượng'. Tại sao không thể gán lớp 'đối tượng' cho bất kỳ thuộc tính người dùng nào? Tôi tin rằng nó liên quan đến quản lý bộ nhớ nhưng nếu người dùng nghĩ về việc thực hiện quản lý bộ nhớ, thì tại sao anh ta không thể ghi đè lên lớp 'đối tượng' trong python? Điều này được dựa trên sự quan tâm của tôi và muốn biết về việc có thể không có bất kỳ ứng dụng có lập trình nào nhưng sẽ rất hay khi biết tính năng nội bộ của chính ngôn ngữ đó.lý do tại sao lớp 'đối tượng' không có thuộc tính người dùng đặt

+2

Thực ra, dưới Python 2.x, chỉ các lớp kiểu mới kế thừa từ '' đối tượng''. (Vâng, và trong Python 3.x, nhưng có tất cả các lớp là kiểu mới, do đó, nó là vô nghĩa để đề cập đến nó). –

+1

Đó không phải là một lý do tuyệt vời cho một downvote - nhưng một nơi tuyệt vời cho một câu trả lời để giáo dục người hỏi ... có vẻ giống như một câu hỏi tốt và hợp lệ với tôi. +1 – ImGreg

+1

Jack, bạn có thể làm rõ liệu bạn đang nói về việc thêm các thuộc tính vào lớp đối tượng hay các cá thể của lớp đó không? –

Trả lời

1

Nếu tôi đã phải lấy lý do từ nguyên tắc đầu tiên, tôi có thể suy nghĩ về nó trong điều kiện của cơ chế __slots__. Một số loại lớp chỉ cần một số thuộc tính nhỏ và tập hợp các thuộc tính luôn được sửa cho mọi cá thể và do đó tính linh hoạt của "dict" như khả năng thuộc tính của người dùng sẽ lãng phí cpu (tra cứu các thuộc tính được đặt tên động) và không gian (chi phí của một dict trống, nhỏ nhưng khác không), mà thực sự có thể thêm lên đến rất nhiều chi phí nếu có một số lượng lớn các trường hợp.

tất nhiên đây chính là vấn đề mà cơ chế __slots__ giải quyết. không gian được cấp phát trên đối tượng cho các thuộc tính được xác định trong các vị trí. nếu có thuộc tính __dict__, thuộc tính không có vị trí, và nếu không có thuộc tính __dict__, bạn sẽ không nhận được thuộc tính động cũng như chi phí của đối tượng dict không cần thiết (là đối tượng heap bổ sung khác với đối tượng).

Đối với lý do tại sao object tự nó không có một khe cắm cho __dict__, tốt, ngay cả khi một lớp con chỉ ra rằng họ không cần khe __dict__, nếu họ kế thừa từ một lớp học mà không, sau đó sơ thẩm vẫn phải có __dict__; nếu object có số __dict__ thì tuyệt đối mọi lớp học cũng sẽ trả giá có số __dict__, ngay cả khi họ không cần.

Thay vào đó; các lớp con nhận được __dict__ (và __weakref__, vì các lý do tương tự) trừ khi chúng tự xác định thuộc tính lớp __slots__.

Và tại sao bạn cần một phiên bản đơn giản là object? Bạn chỉ cần một túi thuộc tính? sau đó sử dụng dict. Nếu bạn thực sự cần một đối tượng thuộc loại nào đó với các hành vi và thuộc tính, thì bạn đang tạo một lớp con.

Lý do duy nhất tôi có thể tưởng tượng bằng cách sử dụng object() thay vì một phân lớp của object, là khi tính năng duy nhất của cá thể được quan tâm là danh tính của nó. Điều này sẽ đưa ra khi một hàm lấy đối số, và cho đó None hoặc một số giá trị trọng điểm rõ ràng khác nên được hiểu như là khác biệt so với mặc định:

BAR_DEFAULT = object() 
def foo(bar=BAR_DEFAULT): 
    if bar is BAR_DEFAULT: 
     #... 

Trong trường hợp này bạn không cần và cũng không đặc biệt muốn các thuộc tính về trường hợp của object,

3

Các loại được xác định trong C không bao giờ có thuộc tính do người dùng chỉ định. Nếu bạn muốn thay thế object trên toàn cầu thì bạn sẽ cần phải lặp qua từng lớp đơn lẻ, sau đó thay thế __builtin__.object để bắt tất cả tạo lớp trong tương lai. Và ngay cả điều đó cũng không đáng tin cậy vì vật thể cũ có thể bị ràng buộc ở một nơi khác.

3

Điều này đã được thảo luận trên StackOverflow, nhưng tôi đang gặp khó khăn trong việc tìm kiếm cuộc thảo luận để liên kết nó.

Lý do tôi tự hỏi là vì tôi muốn đơn giản hóa ví dụ này:

class Box(object): 
    pass 

box = Box() 
box.a = "some value" 
box.b = 42 

Ở đây tôi đang sử dụng box như một loại từ điển, một trong những nơi các phím chỉ có thể là bộ nhận diện. Tôi làm điều này bởi vì nó thuận tiện hơn để viết box.a hơn box["a"].

tôi muốn làm điều này:

box = object() 
box.a = "some value" # doesn't work 

Lý do là object là gốc rễ của tất cả các đối tượng trong Python. Bất kỳ thuộc tính nào mà object phải có trong bất kỳ loại có nguồn gốc nào. Nếu bạn muốn tạo một danh sách lớn chứa một số lượng lớn các đối tượng, bạn muốn chúng càng nhỏ càng tốt để bạn không hết bộ nhớ. Vì vậy, object chính nó là tối thiểu.

EDIT: Tôi tìm thấy liên kết Tôi đã cố gắng để nhớ:

struct objects in python

Các vấn đề liên quan