2013-10-20 15 views
34

Có bất kỳ lối tắt nào để xác định một đối tượng trống trong Python hay bạn luôn phải tạo một cá thể của một lớp trống tùy chỉnh?Tạo một đối tượng trống trong Python

Chỉnh sửa: Tôi có nghĩa là một đối tượng trống có thể sử dụng để nhập vịt.

Trả lời

52

Bạn có thể sử dụng loại để tạo lớp mới khi đang bay và sau đó tạo nhanh lớp đó. Giống như vậy:

>>> t = type('test', (object,), {})() 
>>> t 
<__main__.test at 0xb615930c> 

Đối số cần nhập là: Tên lớp, một bộ lớp cơ sở và từ điển của đối tượng. Có thể chứa các hàm (các phương thức của đối tượng) hoặc các thuộc tính.

Bạn thực sự có thể rút ngắn dòng đầu tiên để

>>> t = type('test',(), {})() 
>>> t.__class__.__bases__ 
(object,) 

Bởi vì theo loại mặc định tạo ra các lớp học kiểu mới mà kế thừa từ đối tượng.

type được sử dụng bằng Python cho metaprogramming.

Nhưng nếu bạn chỉ muốn tạo một đối tượng của đối tượng. Sau đó, chỉ cần tạo một thể hiện của nó. Giống như lejlot gợi ý.

Tạo một thể hiện của một lớp mới như thế này có sự khác biệt quan trọng có thể hữu ích.

>>> a = object() 
>>> a.whoops = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'whoops' 

Trong trường hợp như:

>>> b = type('',(), {})() 
>>> b.this_works = 'cool' 
>>> 
+1

Bạn thậm chí có thể rút ngắn dòng đầu tiên thành 't = type ('',(), {})()' – Tiago

9

Bạn có ý nghĩa gì với "đối tượng trống"? Ví dụ của lớp object? Bạn chỉ có thể chạy

a = object() 

hoặc có thể bạn muốn khởi tạo tham chiếu null? Sau đó, bạn có thể sử dụng

a = None 
+11

Tôi tự hỏi những gì các OP sẽ có thể làm với ' 'a'' định nghĩa hoặc là' 'đối tượng()' 'hoặc'' None'' bởi vì trong trường hợp này , '' a'' không có không gian tên '' __dict__'' và không có thuộc tính nào có thể được thêm vào '' a'' như thế, ví dụ '' ax = 10''. – eyquem

26

Một đơn giản, ít đáng sợ nhìn chiều để tạo ra một sản phẩm nào (-ish) đối tượng là khai thác thực tế là chức năng là các đối tượng trong Python, bao gồm cả chức năng Lambda :

obj = lambda: None 
obj.test = "Hello, world!" 

Ví dụ:

In [18]: x = lambda: None 

In [19]: x.test = "Hello, world!" 

In [20]: x.test 
Out[20]: 'Hello, world!' 
+0

Tôi thích giải pháp này, vì không cần đặt tên –

+3

Hmmm, nhưng nó có nhược điểm là bạn không thể gán cho 'x .__ class __. somefunc' –

17

Có, bằng Python 3.3 SimpleNamespace đã được thêm

Không giống như đối tượng, với SimpleNamespace bạn có thể thêm và xóa thuộc tính. Nếu một đối tượng SimpleNamespace được khởi tạo với các đối số từ khóa, thì những đối tượng đó sẽ được thêm trực tiếp vào vùng tên cơ bản.

Ví dụ:

import types 

x = types.SimpleNamespace() 
x.happy = True 

print(x.happy) # True 

del x.happy 
print(x.happy) # AttributeError. object has no attribute 'happy' 
+1

Tuyệt vời. Tôi đã hy vọng điều này đã được thực hiện dễ dàng hơn trong Python 3! – nealmcb

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