【问题标题】:Don't understand this TypeError: 'list' object is not callable不明白这个 TypeError: 'list' object is not callable
【发布时间】:2015-05-26 09:24:26
【问题描述】:

我有一个名为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'>

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

【问题讨论】:

  • print(b.user()) 正在尝试调用 b.user,这是从 getdata_user 返回的 list 对象 - 不清楚为什么您会期待其他任何东西。跨度>

标签: python python-3.x oop methods attributes


【解决方案1】:

方法和属性不能使用相同的名称;方法只是特殊类型的属性。你的类可能有一个user() 方法,但是通过在实例上设置属性user,当你尝试访问b.user 时,Python 会找到 that 而不是方法:

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

您必须将方法或属性重命名为不冲突。您可以为列表属性使用前导下划线,例如:

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-15
      • 2018-03-31
      • 2021-10-22
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多