在Python中为对象赋予属性

时间:2014-08-20 19:27:18

标签: python

我需要将数组的属性复制到我新创建的另一个数组中。这是我的代码段:

def mutation(self,ind):

    fitnessvalues = ind.fitness.values # saving the attributes

    G = Graph()
    G.add_vertices(nbr_noeuds)

    n = int(math.floor(1 + math.sqrt(1 + 8 * len(ind))/2))
    c = 0

    for i in range(nbr_noeuds-1):
        for j in range(i+1, n):
            if ind[c] == 1:
                G.add_edge(i,j)
            c += 1

    for i in range(10):
        G.rewire(n=3, mode="simple")

    bin =  array.array('b')
    for i in range(n-1):
        for j in range(i+1,n):
            bin.append(int(G.are_connected(i, j)))

    bin.fitness.values = fitnessvalues # Wrongly putting the saved attribute to the new array

    return (bin,)

" bin.fitness.values = fitnessvalues"不是要走的路。那么如何在Python中为数组添加属性呢?

1 个答案:

答案 0 :(得分:1)

在python(和其他面向对象语言)中,通常在类级别定义属性(属性的名称和行为,不一定是它的值),而不是每个实例。在python中,您可以有时将属性添加到要在类级别定义的对象,但是您不能使用内置类型(包括array.array)来执行此操作。以defaultdict为例,defaultdict的所有实例都具有default_factory属性。您可以通过简单地分配属性或使用setattr函数来设置属性。

from collections import defaultdict

d = defaultdict(int)
d.default_factory = float
setattr(d, "default_factory", complex)

您不能将新属性添加到defaultdict或大多数(可能是所有)内置python类型的实例。

d.new_attr = "some value"
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/Users/bagrata/<ipython-input-85-3fd77cc8678c> in <module>()
----> 1 d.new_attr = "blah"

AttributeError: 'collections.defaultdict' object has no attribute 'new_attr'

您可以创建内置类型的子类,并定义新属性:

class MyDefaultdict(defaultdict):
    new_attr = None
d = MyDefaultdict(int)
d.new_attr = "some value"

您还可以向MyDeaultdict的实例添加新属性,因为该类没有明确禁止它,但您绝对不应该这样做:

d.attribute_unique_to_this_instance = "some value"