2009-10-07 37 views
33

Trong javascript nó sẽ là:Làm cách nào để tạo các đối tượng nội tuyến bằng các thuộc tính trong Python?

var newObject = { 'propertyName' : 'propertyValue' }; 

Làm thế nào để làm điều đó bằng Python?

+0

cú pháp tương tự trong python sẽ tạo ra một từ điển, và đó không phải là những gì tôi muốn –

+6

Ông có thể giải thích lý do tại sao ** ** bạn muốn những gì bạn đang yêu cầu cho? Nó có thể giúp mọi người hướng dẫn bạn lựa chọn thay thế tốt hơn, nhiều chất bổ dưỡng hơn. –

+0

@coli Tôi có một phương thức trả về một đối tượng với một số thuộc tính. Trong trường hợp phương thức thất bại, tôi muốn tạo đối tượng này theo cách thủ công. –

Trả lời

64
obj = type('obj', (object,), {'propertyName' : 'propertyValue'}) 

two kinds of type function uses.

+1

+1 cho câu trả lời tốt nhất cho đến nay. –

+0

+1 - Rất thú vị! Tôi không quen với việc sử dụng chức năng kiểu - bạn có thể vui lòng liên kết tôi với một số tài liệu về điều đó không? – Smashery

+1

http://docs.python.org/library/functions.html#type –

10

Tôi không biết nếu có một cách tích hợp để làm điều đó, nhưng bạn luôn có thể định nghĩa một lớp như thế này:

class InlineClass(object): 
    def __init__(self, dict): 
     self.__dict__ = dict 

obj = InlineClass({'propertyName' : 'propertyValue'}) 
4

Tôi thích Smashery's ý tưởng, nhưng Python dường như nội dung để cho phép bạn chỉnh sửa các lớp học của riêng bạn:

>>> class Inline(object): 
...  pass 
... 
>>> obj = Inline() 
>>> obj.test = 1 
>>> obj.test 
1 
>>> 

Hoạt động tốt trong Python 2.5 đối với tôi. Lưu ý rằng bạn phải thực hiện việc này với một lớp học có nguồn gốc từ object - nó sẽ không hoạt động nếu bạn thay đổi dòng thành obj = object.

+2

Đúng, bạn có thể làm điều đó - nhưng vì một lý do lạ, bạn không thể sử dụng đối tượng() - bạn phải tạo lớp của riêng bạn. – Smashery

+5

nếu bạn muốn một lớp nội tuyến, bạn có thể sử dụng 'obj = lambda: None', kỳ quái, nhưng sẽ thực hiện các tác vụ cần thiết ... – Peter

+0

@Peter - Tôi không biết điều đó. Tuy nhiên, bây giờ tôi thấy nó, tôi thích câu trả lời của SilentGhost tốt hơn nhiều. –

19

câu trả lời Phêrô

obj = lambda: None 
obj.propertyName = 'propertyValue' 
+1

Tuyệt vời, nó hoạt động như thế nào? –

+0

@ManelClos anh ta đang tạo ra một đối tượng hàm trả về không có gì mà bạn có thể nhìn thấy với obj(). Đối tượng hàm có thể có các thuộc tính. – jeremyjjbrown

0
class test: 
    def __setattr__(self,key,value): 
     return value 


myObj = test() 
myObj.mykey = 'abc' # set your property and value 
+0

Không cần phải xác định __setattr__, xem phản hồi của Chris –

2

Nó rất dễ dàng bằng Python để khai báo một lớp học với một __init__() chức năng đó có thể thiết lập các ví dụ cho bạn, với đối số tùy chọn. Nếu bạn không chỉ định các đối số bạn nhận được một cá thể trống và nếu bạn chỉ định một số hoặc tất cả các đối số mà bạn khởi tạo cá thể.

Tôi đã giải thích nó here (câu trả lời được xếp hạng cao nhất của tôi cho đến nay) vì vậy tôi sẽ không nhập lại lời giải thích. Nhưng, nếu bạn có câu hỏi, hãy hỏi và tôi sẽ trả lời.

Nếu bạn chỉ muốn một đối tượng chung chung mà lớp không thực sự quan trọng, bạn có thể làm điều này:

class Generic(object): 
    pass 

x = Generic() 
x.foo = 1 
x.bar = 2 
x.baz = 3 

Một phần mở rộng rõ ràng sẽ có thêm một chức năng __str__() đó in một cái gì đó hữu ích.

Thủ thuật này rất hay khi bạn muốn một từ điển thuận tiện hơn. Tôi thấy dễ dàng nhập x.foo hơn x["foo"].

9

Python 3.3 thêm lớp SimpleNamespace cho rằng mục đích chính xác:

>>> from types import SimpleNamespace 

>>> obj = SimpleNamespace(propertyName='propertyValue') 
>>> obj 
namespace(propertyName='propertyValue') 

>>> obj.propertyName 
'propertyValue' 

Ngoài các nhà xây dựng thích hợp để xây dựng các đối tượng, SimpleNamespace định nghĩa __repr____eq__ (documented in 3.4) để hành xử như mong đợi.

+1

Wow, cảm ơn bạn! Tôi biết đã có một cái gì đó như thế này trong Python, và nó đã đi qua khoảng 10 liên kết để tìm thấy điều này. Cảm ơn! – dusktreader

0

Một lựa chọn khả thi là sử dụng namedtuple:

from collections import namedtuple 

message = namedtuple('Message', ['propertyName'], verbose=True) 
messages = [ 
    message('propertyValueOne'), 
    message('propertyValueTwo') 
] 
Các vấn đề liên quan