为什么使用数据类型在Python中初始化实例是不好的?

时间:2012-01-06 03:16:51

标签: class attributes python

很抱歉,如果答案很明显,但我想确定,如果你有(用Python):

class Name(object):

    def __init__(self):
        self.int_att1 = 0
        self.int_att2 = 0
        self.list_att = []

为什么不能(我知道你可以,但我从未见过程序员这样做)你用这种方式初始化它:

class Name(object):

    def __init__(self):
        self.int_att1 = int
        self.int_att2 = int
        self.list_att = list

是否会产生不良影响? 是什么让前者更像Pythonic?

我最好的猜测是因为Python需要 instance.attribute 的值。但是,如果是这样的话,为什么使用数据类型呢?

3 个答案:

答案 0 :(得分:3)

执行self.int_att1 = int时,属性int_att1现在引用类型 int,我的意思是,它只是int的另一个名称。我将以一种简单的方式证明这一点:

>>> number_type = int
>>> i = number_type()
>>> i
0
>>> type(i)
<type 'int'>

在此代码中,number_type成为int类型的“同义词”,这就是为什么当我询问i的类型时,它返回int而不是number_type {1}}。

self.list_att = list相同。


可能你想做的是:

class Name(object):

    def __init__(self):
        self.int_att1 = int()
        self.int_att2 = int()
        self.list_att = list()

这完全不同,您不再将属性分配给属性。相反,您将分配该类型的初始值。让我们看看那些初始值是什么:

>>> initial_int = int()
>>> initial_int
0
>>> initial_list = list()
>>> initial_list
[]

因此,我们可以清楚地看到int类型的初始值为0,类型list的初始值为[],这正是你在找什么!

答案 1 :(得分:2)

可以,但它有完全不同的效果。在第二种情况下,您将属性设置为类型的值,这通常不是您想要的。在Python中,类型也是对象,所以这是合法的。

它会让你做类似的事情:

n = Name()

v = n.int_att1()
然后

v将为0,因为这是由int的无参数构造函数构造的值。

答案 2 :(得分:0)

来自The Zen of Python:“明确比隐含更好。”

您当然可以使用类型的默认值(不是示例中的类型本身)进行初始化,但显式优于隐式。当您使用实际值初始化时,毫无疑问您将获得什么。