2012-02-10 40 views
8

Tôi đang làm việc với một ORM chấp nhận các lớp như đầu vào và tôi cần để có thể cho nó một số lớp được tạo động. Hiện nay, tôi đang làm một cái gì đó giống như ví dụ giả tạo này:Cách ít nhất là xấu để tạo các lớp Python trong thời gian chạy là gì?

def make_cls(_param): 
    def Cls(object): 
     param = _param 
    return Cls 

A, B = map(make_cls, ['A', 'B']) 

print A().foo 
print B().foo 

Trong khi điều này hoạt động tốt, nó cảm thấy ra bởi một chút: ví dụ, cả hai lớp in như <class '__main__.Cls'> trên repl. Trong khi vấn đề tên không phải là một vấn đề lớn (tôi nghĩ rằng tôi có thể làm việc xung quanh nó bằng cách thiết lập __name__), tôi tự hỏi nếu có những thứ khác tôi không biết. Câu hỏi của tôi là: có cách nào tốt hơn để tạo các lớp động hay ví dụ của tôi chủ yếu là tốt?

+0

Bản sao có thể có của http://stackoverflow.com/questions/4513192/python-dynamic-class-names – Cez

+3

Như ghi chú của Roman bên dưới, bạn sẽ muốn sử dụng 'loại' để tạo động các lớp. Câu trả lời hàng đầu trong [câu hỏi này] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python) bao gồm chi tiết này rất chi tiết. – aganders3

+0

"ORM"? ORM nào? Tỷ lệ cược là tốt ORM làm nhiều điều này cho bạn. –

Trả lời

10

Lớp học là gì? Nó chỉ là một ví dụ của type. Ví dụ:

>>> A = type('A', (object,), {'s': 'i am a member', 'double_s': lambda self: self.s * 2}) 
>>> a = A() 
>>> a 
<__main__.A object at 0x01229F50> 
>>> a.s 
'i am a member' 
>>> a.double_s() 
'i am a memberi am a member' 

Từ doc:

loại (tên, căn cứ, dict)

Return một đối tượng kiểu mới. Đây thực chất là một dạng động của câu lệnh lớp.

+0

Vì loại chỉ nhận được 3 thông số này, tôi có an toàn không cho rằng tên đó thực sự là thứ duy nhất bị sai hoặc là có lợi thế khác để sử dụng 'loại' quá? – hugomg

+1

Một cách tốt đẹp để gói này là để bọc nó trong một chức năng mà có đối số từ khóa, vì vậy bạn có thể dễ dàng xác định các thuộc tính của lớp mới trong cuộc gọi chức năng. – kindall

+0

@missingno Vâng, bạn tiếp cận sẽ hữu ích khi tạo một số lớp phức tạp (ví dụ, bổ sung 'classmethod' với cách sử dụng' type' sẽ là xấu), nhưng nếu bạn cần xây dựng một số phức tạp trong thời gian chạy thì có thể xấu xảy ra với kiến ​​trúc của bạn :) 'type' chỉ là giải pháp được khuyến nghị cho những thứ như vậy. –

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