我有一个名为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'>
所以很明显是什么问题。我只是不知道类转换如何掩盖列表的第一个元素。有什么想法吗?
答案 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)