2008-11-12 42 views
135

Giả sử tôi có một đối tượng python x và một chuỗi s, làm cách nào để đặt thuộc tính s trên x? Vì vậy:Làm thế nào để bạn lập trình một thuộc tính?

>>> x = SomeObject() 
>>> attr = 'myAttr' 
>>> # magic goes here 
>>> x.myAttr 
'magic' 

Phép thuật là gì? Mục đích của việc này, tình cờ, là lưu vào bộ nhớ cache đến số x.__getattr__().

Trả lời

208
setattr(x, attr, 'magic') 

Để được trợ giúp về nó:

>>> help(setattr) 
Help on built-in function setattr in module __builtin__: 

setattr(...) 
    setattr(object, name, value) 

    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to 
    ``x.y = v''. 

Edit: Tuy nhiên, bạn nên lưu ý (như đã chỉ ra trong bình luận) mà bạn không thể làm điều đó với một trường hợp "tinh khiết" của đối tượng. Nhưng có khả năng bạn có một lớp con đơn giản của đối tượng, nơi nó sẽ hoạt động tốt. Tôi sẽ mạnh mẽ yêu cầu O.P. không bao giờ tạo ra các thể hiện của đối tượng như thế.

+8

cẩn thận, tuy nhiên, điều này không làm việc trong kịch bản của bạn, nơi bạn đang tạo một thể hiện của đối tượng(). –

+3

Hoàn toàn đúng, nó không. Tôi thuận tiện phớt lờ điều đó. Tôi sẽ mạnh mẽ yêu cầu O.P. không bao giờ tạo ra các thể hiện của đối tượng như thế. –

+0

+1: "không bao giờ tạo ra đối tượng của đối tượng như thế" –

40

Thông thường, chúng tôi xác định các lớp học cho việc này.

class XClass(object): 
    def __init__(self): 
     self.myAttr= None 

x= XClass() 
x.myAttr= 'magic' 
x.myAttr 

Tuy nhiên, bạn có thể, đến một mức độ nào đó, làm điều này với các chức năng được xây dựng trong setattrgetattr. Tuy nhiên, chúng không hoạt động trên các phiên bản trực tiếp của object.

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

Tuy nhiên, chúng hoạt động trên tất cả các loại lớp đơn giản.

class YClass(object): 
    pass 

y= YClass() 
setattr(y, 'myAttr', 'magic') 
y.myAttr 
+19

Bất kỳ thông tin chi tiết nào về lý do tại sao nó không hoạt động với các đối tượng()? – meawoppl

+0

@meawoppl Bạn nên hỏi đó là [câu hỏi mới] (http://stackoverflow.com/questions/ask) –

10

let x là một đối tượng thì bạn có thể làm điều đó hai cách

x.attr_name = s 
setattr(x, 'attr_name', s) 
Các vấn đề liên quan