2011-12-20 24 views
11

Làm cách nào để tạo các đối tượng nhanh chóng bằng Python? Tôi thường muốn chuyển thông tin đến các mẫu Django của tôi được định dạng như sau:Làm thế nào để tạo các đối tượng trên bay trong python?

{'test': [a1, a2, b2], 'test2': 'something else', 'test3': 1} 

làm cho mẫu trông không rõ ràng. vì vậy tôi nghĩ rằng nó tốt hơn để chỉ cần tạo một đối tượng mà là giống như:

class testclass(): 
    self.test = [a1,a2,b2] 
    self.test2 = 'someting else' 
    self.test3 = 1 
testobj = testclass() 

vì vậy tôi có thể làm:

{{ testobj.test }} 
{{ testobj.test2 }} 
{{ testobj.test3 }} 

thay vì gọi từ điển.

Vì tôi chỉ cần đối tượng đó một lần, có thể tạo ra nó mà không cần viết một lớp trước? Có bất kỳ mã ngắn tay nào không? Là nó ok để làm điều đó như thế hay là nó Python xấu?

+5

Vâng, trước tiên, bạn phải có được con ruồi đứng yên. Sau đó, bạn cần phải tạo ra một số đối tượng RẤT NHỎ ... (Xin lỗi, không thể cưỡng lại.) –

Trả lời

22

Bạn có thể sử dụng built-in type function:

testobj = type('testclass', (object,), 
       {'test':[a1,a2,b2], 'test2':'something else', 'test3':1})() 

Nhưng trong trường hợp cụ thể này (đối tượng dữ liệu cho Django mẫu), bạn nên sử dụng giải pháp @ Xion.

+5

Xin đừng làm điều này. Đơn giản là tốt hơn phức tạp. –

+1

@ number5 Tôi sẽ bỏ phiếu cho câu trả lời của bạn nếu bạn cũng đề xuất không sử dụng mã này! (ít nhất là không cho trường hợp cụ thể này) –

+0

+1 Điều này trả lời câu hỏi mà tôi đã yêu cầu với Google. – MrOodles

19

Trong mẫu Django, ký hiệu chấm (testobj.test) có thể giải quyết cho toán tử [] của Python. Điều này có nghĩa rằng tất cả bạn cần là một dict bình thường:

testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1} 

đèo nó như testobj biến cho mẫu của bạn và bạn có thể tự do sử dụng {{ testobj.test }} và tương tự như biểu thức bên trong mẫu của bạn. Chúng sẽ được dịch sang testobj['test']. Không có lớp học chuyên dụng là cần thiết ở đây.

+0

cảm ơn bạn, đã giải quyết phần liên quan đến django của vấn đề của tôi :) tôi vừa kiểm tra câu trả lời khác bởi vì mọi người đến đây từ google có lẽ sẽ thích xem câu trả lời liên quan đến python. – JasonTS

+1

@JasonTS, câu trả lời liên quan đến python sẽ là sử dụng câu trả lời của Karl Knechtel về 'collections.namedtuple'. – Duncan

0

Đoạn code dưới đây cũng đòi hỏi một lớp được tạo ra tuy nhiên nó là ngắn hơn:

>>>d = {'test':['a1','a2','b2'], 'test2':'something else', 'test3':1} 
>>> class Test(object): 
... def __init__(self): 
... self.__dict__.update(d) 
>>> a = Test() 
>>> a.test 
['a1', 'a2', 'b2'] 
>>> a.test2 
'something else' 
5

Có một giải pháp trong Python 3.3+types.SimpleNamespace

from types import SimpleNamespace 
test_obj = SimpleNamespace(a=1, b=lambda: {'hello': 42}) 

test_obj.a 
test_obj.b() 
0

sử dụng chức năng xây dựng loại: document

>>> class X: 
...  a = 1 
... 
>>> X = type('X', (object,), dict(a=1)) 

X đầu tiên và thứ hai là số nhận dạng cal

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