2011-11-29 5 views
17

tôi cần phải thực hiện một loạt các biến lớp học và tôi muốn làm điều đó bằng cách lặp thông qua một danh sách như thế:làm thế nào để tạo ra biến động lớp trong python

vars=('tx','ty','tz') #plus plenty more 

class Foo(): 
    for v in vars: 
     setattr(no_idea_what_should_go_here,v,0) 

là nó có thể? Tôi không muốn làm cho họ cho một ví dụ (sử dụng tự trong __init__) nhưng như biến lớp.

+2

Tại sao không giữ chúng trong dict? – DrTyrsa

+0

Bạn có muốn chia sẻ các biến số giữa các trường hợp khác nhau không? – luc

+0

không chắc chắn. rất có thể. yêu cầu đến từ API và tôi không biết cách chúng được sử dụng trong đó. – pawel

Trả lời

27

Bạn có thể chạy mã chèn ngay sau khi một lớp được tạo ra:

class Foo(): 
    ... 

vars=('tx', 'ty', 'tz') # plus plenty more 
for v in vars: 
    setattr(Foo, v, 0) 

Ngoài ra, bạn có thể tự động lưu trữ các biến trong khi lớp đã được tạo ra:

class Bar: 
    locals()['tx'] = 'texas' 
+0

ah. thật tuyệt. Tôi sẽ cung cấp cho nó một đi và xem API tôi làm việc với có thể xử lý đó. cảm ơn bạn! – pawel

5

Nếu vì lý do nào đó bạn không thể sử dụng câu trả lời của Raymond về việc thiết lập chúng sau khi tạo lớp, có lẽ bạn có thể sử dụng metaclass:

class MetaFoo(type): 
    def __new__(mcs, classname, bases, dictionary): 
     for name in dictionary.get('_extra_vars',()): 
      dictionary[name] = 0 
     return type.__new__(mcs, classname, bases, dictionary) 

class Foo(): # For python 3.x use 'class Foo(metaclass=MetaFoo):' 
    __metaclass__=MetaFoo # For Python 2.x only 
    _extra_vars = 'tx ty tz'.split() 
+1

'name' cho các xung đột vòng lặp với đối số' __new__' –

+0

@UszyWieloryba cảm ơn, đã chỉnh sửa – Duncan