Làm thế nào để bạn lập trình thiết lập một thuộc tính?


204

Giả sử tôi có một đối tượng python xvà một chuỗi s, làm thế nào để tôi đặt thuộc tính strên x? Vì thế:

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

Phép thuật là gì? Mục tiêu của việc này, tình cờ, là để lưu trữ các cuộc gọi đến x.__getattr__().

Câu trả lời:


288
setattr(x, attr, 'magic')

Để được 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''.

Chỉnh sửa: Tuy nhiên, bạn cần lưu ý (như được chỉ ra trong một nhận xét) rằng bạn không thể làm điều đó với một ví dụ "thuần túy" object. 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 mạnh mẽ kêu gọi OP đừng bao giờ tạo ra những trường hợp như thế.


12
Tuy nhiên, cẩn thận, điều này không hoạt động trong kịch bản của bạn khi bạn đang tạo một thể hiện của đối tượng ().
S.Lott

3
Hoàn toàn đúng, nó không. Tôi thuận tiện bỏ qua điều đó. Tôi mạnh mẽ kêu gọi OP đừng bao giờ tạo ra những trường hợp như thế.
Ali Afshar

2
Thật xấu hổ vì nó không hoạt động trong mọi trường hợp, vì điều đó sẽ thực sự hữu ích, ví dụ, để thêm dirtythuộc tính vào đầu vào của người dùng ...
brice

1
@Brice: setattr hoạt động trong hầu hết các trường hợp. Vì hiệu quả và các lý do khác, 'đối tượng' được lập trình để bạn không thể thêm các thuộc tính bổ sung cho nó. Bạn có thể làm điều này với lớp của riêng bạn với __slots__thuộc tính.
dirkjot

4
Điều này cũng không hoạt động int. Bạn có thể giải thích lý do tại sao? (có phải trên tất cả __builtin__?
Jens Timmerman

53

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

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

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

Tuy nhiên, ở một mức độ nào đó, bạn có thể làm điều này với các chức năng setattrvà tích getattrhợp sẵn. Tuy nhiên, họ không làm việc trên các trường hợp objecttrực tiếp.

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

Họ làm, tuy nhiên, làm việc 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

25
Bất kỳ cái nhìn sâu sắc về lý do tại sao điều này không hoạt động với các trường hợp của đối tượng ()?
meawoppl

@meawoppl Bạn nên hỏi như một câu hỏi mới
Tobias Kienzler

Hỏi đây .
jalanb

1
Tôi có thể làm điều này với Mô-đun, thay vì Lớp học không?
bonobo

21

Đặt x là một đối tượng thì bạn có thể làm theo hai cách

x.attr_name = s 
setattr(x, 'attr_name', s)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.