不明白这个TypeError:'list'对象是不可调用的错误

时间:2015-03-23 11:43:52

标签: python python-3.x

我有一个名为im.py的文件,其中包含几个函数和几个类。第一个函数和类失败了

TypeError: 'list' object is not callable

问题似乎是在函数中创建的列表的第一个元素,然后传递给该类。大多数列表可以由类处理,但第一个元素不能。过渡到类名空间似乎是个问题:

def getdata_user():
    import os
    user = os.getlogin()
    gids = os.getgroups()
    home = os.getenv('HOME')
    return [user, gids, home]

class FirstClass:
    def setdata_user(self):
        self.user = getdata_user()    
    def displaydata_user(self):
        print(self.user)
    def user(self):
        u = self.user[0]
        return u
    def gids(self):
        g = self.user[1]
        return g
    def home(self):
        h = self.user[2]
        return h

在交互式会话中,功能完全正常:

>>> from im import *
>>> a = getdata_user()
>>> print(a)
['fred', [4, 24, 27, 30, 46, 109, 125, 1000], '/home/fred']
>>> print(a[0])
jreese
>>> print(a[1])
[4, 24, 27, 30, 46, 109, 125, 1000]
>>> print(a[2])
/home/fred

但是在课堂上:

>>> b = FirstClass()
>>> b.setdata_user()
>>> print(b.home())
/home/jreese
>>> print(b.gids())
[4, 24, 27, 30, 46, 109, 125, 1000]
>>> print(b.user())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

所以回顾一下:

>>> type(b.user())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

>>> type(a[0])
<class 'str'>

所以很明显是什么问题。我只是不知道类转换如何掩盖列表的第一个元素。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您不能对方法和属性使用相同的名称;方法只是特殊的属性。您的类可能有user()方法,但通过在实例上设置属性user,Python会在您尝试访问{{1}时找到 而不是方法}:

b.user

您必须重命名方法或属性才能发生冲突。您可以对list属性使用前导下划线,例如:

>>> type(b.user)  # no call, just the attribute
<class 'list'>

答案 1 :(得分:0)

Python与其他语言不同,其中字段和方法可以共享相同的名称(例如Java)。在Python中,当您为实例属性指定与方法相同的名称时,该方法将被属性隐藏。

然而,通常python避免使用getter和setter,因为它们在Python中不像在静态类型语言(例如Java)中那样提供相同的好处。

在Python中,你更有可能做类似的事情:

class FirstClass:
    def setdata_user(self):
        data = getdata_user()
        self.user = data[0]
        self.gids = data[1]
        self.home = data[2]
        # or more simply
        self.user, self.gids, self.home = getdata_user()

    def displaydata_user(self):
        print([self.user, self.gids, self.home])

obj = FirstClass()
obj.setdata_user()
obj.displaydata_user()
# accessing individual attributes
print("user:", obj.user)
print("gids:", obj.gids)
print("home:", obj.home)