Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

Tôi muốn tạo một đối tượng động (bên trong một đối tượng khác) trong Python và sau đó thêm các thuộc tính cho nó.

Tôi đã thử:

obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')

Nhưng điều này không hoạt động.

Bất kỳ ý tưởng?

edit:

Tôi đang đặt các thuộc tính từ vòng lặp

class Object(object):
    pass

a = Object()
a.somefield = somevalue
2 lặp qua danh sách các giá trị, ví dụ:

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable

Trong ví dụ trên, tôi sẽ nhận được

class Object(object):
    pass

a = Object()
a.somefield = somevalue
3,
class Object(object):
    pass

a = Object()
a.somefield = somevalue
4,
class Object(object):
    pass

a = Object()
a.somefield = somevalue
5.

Tôi đã sử dụng hàm

class Object(object):
    pass

a = Object()
a.somefield = somevalue
6 vì tôi không biết làm thế nào để thực hiện
class Object(object):
    pass

a = Object()
a.somefield = somevalue
7 từ vòng lặp
class Object(object):
    pass

a = Object()
a.somefield = somevalue
2.

Làm thế nào tôi sẽ đặt thuộc tính dựa trên giá trị của

class Object(object):
    pass

a = Object()
a.somefield = somevalue
9 trong ví dụ trên?


Để biết chi tiết về lý do tại sao nó không hoạt động, hãy xem không thể đặt các thuộc tính trên ví dụ của lớp "đối tượng".why it doesn't work, see Can't set attributes on instance of "object" class.

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

Karl Knechtel

59.4K10 Huy hiệu vàng86 Huy hiệu bạc132 Huy hiệu đồng10 gold badges86 silver badges132 bronze badges

Khi được hỏi ngày 13 tháng 5 năm 2010 lúc 14:34May 13, 2010 at 14:34

4

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
0 tích hợp có thể được khởi tạo nhưng không thể có bất kỳ thuộc tính nào được đặt trên đó. (Tôi ước nó có thể, với mục đích chính xác này.) Nó không có
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
1 để giữ các thuộc tính.

Tôi thường chỉ làm điều này:

class Object(object):
    pass

a = Object()
a.somefield = somevalue

Khi tôi có thể, tôi đặt cho lớp

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
2 một cái tên có ý nghĩa hơn, tùy thuộc vào loại dữ liệu tôi đang đặt vào đó.

Một số người làm một việc khác, trong đó họ sử dụng một lớp phụ của

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
3 cho phép truy cập thuộc tính để có được các phím. (
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
4 thay vì
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
5)

Chỉnh sửa: Để bổ sung vào câu hỏi của bạn, sử dụng

class Object(object):
    pass

a = Object()
a.somefield = somevalue
6 là tốt. Bạn không thể sử dụng
class Object(object):
    pass

a = Object()
a.somefield = somevalue
6 trên các trường hợp
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
8.
: For the addition to your question, using
class Object(object):
    pass

a = Object()
a.somefield = somevalue
6 is fine. You just can't use
class Object(object):
    pass

a = Object()
a.somefield = somevalue
6 on
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
8 instances.

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:41May 13, 2010 at 14:41

FoglebirdfoglebirdFogleBird

72K25 Huy hiệu vàng122 Huy hiệu bạc131 Huy hiệu Đồng25 gold badges122 silver badges131 bronze badges

7

Bạn có thể sử dụng công thức Bunch cổ xưa của tôi, nhưng nếu bạn không muốn tạo ra một "lớp bó", một lớp rất đơn giản đã tồn tại trong Python - tất cả các chức năng có thể có các thuộc tính tùy ý (bao gồm các hàm Lambda). Vì vậy, các tác phẩm sau:

obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')

Cho dù sự mất mát của sự rõ ràng so với công thức

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
9 đáng kính là OK, là một quyết định về phong cách tôi tất nhiên sẽ để lại cho bạn.

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:49May 13, 2010 at 14:49

Alex Martellialex MartelliAlex Martelli

829K163 Huy hiệu vàng1204 Huy hiệu bạc1383 Huy hiệu Đồng163 gold badges1204 silver badges1383 bronze badges

14

Mô -đun

obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')
0 về cơ bản được thực hiện cho điều đó.

import mock
obj = mock.Mock()
obj.a = 5

Đã trả lời ngày 9 tháng 2 năm 2017 lúc 15:47Feb 9, 2017 at 15:47

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

DunatotatosdunatotatosDunatotatos

1.63615 huy hiệu bạc24 Huy hiệu đồng15 silver badges24 bronze badges

3

Bạn cũng có thể sử dụng một đối tượng lớp trực tiếp; Nó tạo ra một không gian tên:

class a: pass
a.somefield1 = 'somevalue1'
setattr(a, 'somefield2', 'somevalue2')

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

Đã trả lời ngày 5 tháng 1 năm 2018 lúc 23:44Jan 5, 2018 at 23:44

ErnestoernestoErnesto

9308 Huy hiệu bạc13 Huy hiệu Đồng8 silver badges13 bronze badges

3

Có một vài cách để đạt được mục tiêu này. Về cơ bản, bạn cần một đối tượng có thể mở rộng.

obj.a = type('Test', (object,), {})  
obj.a.b = 'fun'  

obj.b = lambda:None

class Test:
  pass
obj.c = Test()

Mbarkhau

7.9904 Huy hiệu vàng29 Huy hiệu bạc34 Huy hiệu đồng4 gold badges29 silver badges34 bronze badges

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:48May 13, 2010 at 14:48

Evilpieevilpieevilpie

2.66519 huy hiệu bạc21 Huy hiệu đồng19 silver badges21 bronze badges

1

Bây giờ bạn có thể làm (không chắc đó có phải là câu trả lời giống như Evilpie):

MyObject = type('MyObject', (object,), {})
obj = MyObject()
obj.value = 42

Đã trả lời ngày 13 tháng 9 năm 2013 lúc 0:32Sep 13, 2013 at 0:32

Andreabediniandreabediniandreabedini

1.2751 Huy hiệu vàng12 Huy hiệu bạc20 Huy hiệu Đồng1 gold badge12 silver badges20 bronze badges

1

Thử mã bên dưới:

$ python
>>> class Container(object):
...     pass 
...
>>> x = Container()
>>> x.a = 10
>>> x.b = 20
>>> x.banana = 100
>>> x.a, x.b, x.banana
(10, 20, 100)
>>> dir(x)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__',     '__sizeof__', 
'__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'banana']

Đã trả lời ngày 23 tháng 7 năm 2015 lúc 20:49Jul 23, 2015 at 20:49

Neldorneldorneldor

2312 Huy hiệu bạc2 Huy hiệu đồng2 silver badges2 bronze badges

4

Như tài liệu nói:

Lưu ý:

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
0 không có
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
1, vì vậy bạn có thể gán các thuộc tính tùy ý cho một thể hiện của lớp
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
0.
:
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
0 does not have a
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
1, so you can’t assign arbitrary attributes to an instance of the
params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)
0 class.

Bạn chỉ có thể sử dụng thể hiện lớp giả.

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:43May 13, 2010 at 14:43

SilentghostsilentghostSilentGhost

296K64 Huy hiệu vàng302 Huy hiệu bạc291 Huy hiệu Đồng64 gold badges302 silver badges291 bronze badges

Những giải pháp này rất hữu ích trong quá trình thử nghiệm. Dựa trên câu trả lời của mọi người khác, tôi làm điều này trong Python 2.7.9 (không có STATICMETHOD, tôi nhận được một kiểu mẫu (phương pháp không bị ràng buộc ...):

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
0

Đã trả lời ngày 27 tháng 8 năm 2015 lúc 20:34Aug 27, 2015 at 20:34

Robpol86Robpol86Robpol86

1.54520 Huy hiệu bạc16 Huy hiệu Đồng20 silver badges16 bronze badges

Nếu chúng ta có thể xác định và tổng hợp tất cả các thuộc tính và giá trị lại với nhau trước khi tạo đối tượng lồng nhau, thì chúng ta có thể tạo một lớp mới có một đối số từ điển về việc tạo.

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
1

Chúng tôi cũng có thể cho phép đối số từ khóa. Xem bài viết này.

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
2

Đã trả lời ngày 19 tháng 11 năm 2018 lúc 21:59Nov 19, 2018 at 21:59

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

HarlemsquirrelharlemsquirrelHarlemSquirrel

7.8164 Huy hiệu vàng32 Huy hiệu bạc33 Huy hiệu đồng4 gold badges32 silver badges33 bronze badges

Bạn đang sử dụng đối tượng nào? Chỉ cần thử điều đó với một lớp mẫu và nó hoạt động tốt:

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
3

Và tôi đã nhận được

obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')
4 là câu trả lời.

Tình huống duy nhất mà tôi thấy điều này thất bại là nếu bạn đang thử

class Object(object):
    pass

a = Object()
a.somefield = somevalue
6 trên một đối tượng tích hợp.

CẬP NHẬT: Từ nhận xét, đây là sự lặp lại của: Tại sao bạn không thể thêm các thuộc tính vào đối tượng trong Python?

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:52May 13, 2010 at 14:52

Jnevesjnevesjneves

1.0447 Huy hiệu bạc7 Huy hiệu đồng7 silver badges7 bronze badges

1

Tôi nghĩ rằng cách dễ nhất là thông qua các mô -đun bộ sưu tập.

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
4

Đã trả lời ngày 21 tháng 8 năm 2020 lúc 15:58Aug 21, 2020 at 15:58

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

PjlpjlPjl

1.75418 Huy hiệu bạc21 Huy hiệu đồng18 silver badges21 bronze badges

Đến vào cuối ngày, nhưng đây là Pennyworth của tôi với một đối tượng chỉ tình cờ giữ một số đường dẫn hữu ích trong một ứng dụng nhưng bạn có thể điều chỉnh nó cho bất cứ điều gì bạn muốn có một thông tin mà bạn có thể truy cập với Getattr và Dot ký hiệu (Đó là những gì tôi nghĩ câu hỏi này thực sự là về):

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
5

Điều này thật tuyệt vì bây giờ:

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
6

Vì vậy, điều này sử dụng đối tượng hàm như câu trả lời trên nhưng sử dụng hàm để có được các giá trị (bạn vẫn có thể sử dụng

obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')
6 thay vì
obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')
7 nếu bạn thích).

Đã trả lời ngày 2 tháng 3 năm 2016 lúc 2:17Mar 2, 2016 at 2:17

Paul Whipppaul WhippPaul Whipp

15.3k4 Huy hiệu vàng42 Huy hiệu bạc52 Huy hiệu Đồng4 gold badges42 silver badges52 bronze badges

Nếu bạn đang tìm kiếm sự gán chuỗi, để làm những việc như mẫu Django Mẫu Tóm tắt Tóm tắt Gán:

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
7

cho phép bạn truyền mô hình dưới dạng

obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')
8 và gán thuộc tính cuối cho nó.

Đã trả lời ngày 25 tháng 4 lúc 12:50Apr 25 at 12:50

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

WeiloryweiloryWeilory

2.10612 Huy hiệu bạc27 Huy hiệu đồng12 silver badges27 bronze badges

Điều này hoạt động tốt:

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
8

Nếu bạn muốn đặt thuộc tính thành một số giá trị, hãy làm điều này:

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
9

Để giá trị là một chuỗi, bạn sẽ phải sử dụng các \ "này thay vì các dấu ngoặc kép trừ khi bạn có giá trị được lưu trữ trong một biến.

Đã trả lời ngày 6 tháng 7 lúc 17:04Jul 6 at 17:04

class Object(object):
    pass

a = Object()
a.somefield = somevalue
0

Đã trả lời ngày 27 tháng 12 năm 2013 lúc 19:41Dec 27, 2013 at 19:41

Lmoktolmoktolmokto

1319 Huy hiệu đồng9 bronze badges

Cách khác tôi thấy, theo cách này:

class Object(object):
    pass

a = Object()
a.somefield = somevalue
1

Leota

1.5782 Huy hiệu vàng12 Huy hiệu bạc33 Huy hiệu đồng2 gold badges12 silver badges33 bronze badges

Đã trả lời ngày 13 tháng 5 năm 2016 lúc 17:22May 13, 2016 at 17:22

Hướng dẫn how do you create a new attribute in python? - làm thế nào để bạn tạo một thuộc tính mới trong python?

2

Làm thế nào để bạn thêm các thuộc tính trong Python?

Thêm các thuộc tính vào một lớp Python rất thẳng về phía trước, bạn chỉ cần sử dụng '.' toán tử sau một phiên bản của lớp với bất kỳ tên tùy ý nào bạn muốn thuộc tính được gọi, theo sau là giá trị của nó.use the '. ' operator after an instance of the class with whatever arbitrary name you want the attribute to be called, followed by its value.

Làm thế nào để bạn thêm một thuộc tính mới vào một đối tượng?

Procedure..
Trên tab Danh sách, chọn đối tượng mà bạn muốn thêm thuộc tính ..
Trên tab Thuộc tính, nhấp vào hàng mới ..
Trong trường thuộc tính, chỉ định một giá trị ..
Chỉ định các giá trị trong trường tiêu đề và trường Mô tả ..

Một thuộc tính trong ví dụ Python là gì?

Các thuộc tính của một lớp là các đối tượng hàm xác định các phương thức tương ứng của các trường hợp của nó.Chúng được sử dụng để thực hiện các điều khiển truy cập của các lớp.Các thuộc tính của một lớp cũng có thể được truy cập bằng các phương thức và hàm tích hợp sau: getattr ()-hàm này được sử dụng để truy cập thuộc tính của đối tượng.function objects that define corresponding methods of its instances. They are used to implement access controls of the classes. Attributes of a class can also be accessed using the following built-in methods and functions : getattr() – This function is used to access the attribute of object.

Làm thế nào để bạn tạo một thuộc tính thể hiện trong Python với ví dụ?

Một thuộc tính thể hiện là một biến Python chỉ thuộc về một đối tượng.Nó chỉ có thể truy cập trong phạm vi của đối tượng và nó được xác định bên trong hàm tạo hàm của một lớp.Ví dụ, __init __ (tự, ..).__init__(self,..).