2012-01-06 35 views
1

很抱歉,如果这个问题的答案是显而易见的,但我想可以肯定的,如果你有(在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。但是,如果是这种情况,为什么使用数据类型的作品?

+0

不要忘记接受适合您的答案(点击您最喜欢的那个绿色复选标记)。你也应该为你的其他问题做这个。 – 2012-01-06 16:59:47

回答

2

当你做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

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[]的初始值,这是你在寻找什么对于!

+0

这个答案很棒。还有一件事,这被认为是不好的做法? – BLUC 2012-01-07 10:21:28

+0

哪一个? 'self.int_att1 = int'或'self.int_att1 = int()'? – juliomalegria 2012-01-07 14:36:05

2

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

这将让你做这样的事情:然后

n = Name() 

v = n.int_att1() 

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

0

The Zen of Python:“显式优于隐式”。

你当然可以初始化一个类型的默认值(不是类型本身,如你的例子),但显式比隐式更好。当你用一个实际的值进行初始化时,毫无疑问你得到了什么。

相关问题