Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类中的列表错误问题_Python_Class_Oop - Fatal编程技术网

python类中的列表错误问题

python类中的列表错误问题,python,class,oop,Python,Class,Oop,我试图理解MIT python类中的以下代码。当我创建一个类intSet的对象时,如下所示,我在其中一个属性上遇到了一些问题 s=intSet() 试一试 s.vals() 我得到以下错误 Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> s.vals() TypeError: 'list' object is not callable 回溯(最近一次

我试图理解MIT python类中的以下代码。当我创建一个类intSet的对象时,如下所示,我在其中一个属性上遇到了一些问题

s=intSet()
试一试

s.vals()
我得到以下错误

  Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    s.vals()
TypeError: 'list' object is not callable
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
s、 VAL()
TypeError:“列表”对象不可调用

为什么会这样?我被告知不应直接尝试s.vals,因为数据隐藏。当我尝试s.vals时,会返回正确的列表,但在尝试s.vals()时出错。有人能解释这个错误吗?我对OOP和python都是新手,所以我为我拙劣的提问道歉。非常感谢您的帮助

VAL不是一个方法,而是一个属性,因此您不能调用它。在python中,括号表示您正在调用一个方法。所以只需执行
s.vals

vals不是一个方法,而是一个属性,因此不能调用它。在python中,括号表示您正在调用一个方法。因此,只需执行
s.vals

当您使用s.vals()时,它会尝试通过变量“s”调用函数“vals”,而当您使用s.vals时,它不会查找函数,只会返回存储在s.vals中的值。

当您使用s.vals()时,它会尝试通过变量“s”调用函数“vals”,而,使用s.vals时,它不查找函数,只返回存储在s.vals中的值。

您试图调用的
vals
是一个列表。您正在执行类似于
[]()
的操作,这是不可能的

在OOP方式中,您应该这样声明getter函数:

class intSet(object):
    def __init__(self):
        self.__vals = [] # kinda private class instance
        # .... other code


    @property
    def vals(self):
        return self.__vals

intset = intSet()
intset.vals # is that list

更多信息和

您正在尝试调用列表中的
VAL
。您正在执行类似于
[]()
的操作,这是不可能的

在OOP方式中,您应该这样声明getter函数:

class intSet(object):
    def __init__(self):
        self.__vals = [] # kinda private class instance
        # .... other code


    @property
    def vals(self):
        return self.__vals

intset = intSet()
intset.vals # is that list

更多信息和

为什么要加括号?请将所有代码以文本形式发布在此处。添加括号会带来什么效果?圆括号试图像函数一样使用属性,也就是说,它试图像函数一样调用属性。正如错误所述,
s.vals
是一个列表,它是不可调用的。顺便说一句,虽然这是一个很好的过程,但不幸的是它不符合典型的python约定。如果希望属性为“private”,请预先挂起下划线,
self.\u vals=[]
。这是约定的隐私,实际上没有人被阻止访问您的属性。但是使用您的代码库的人知道“这是一个实现细节,不是一个保证,不要使用它,如果您这样做了,就知道您不能依赖这种行为”。此外,Python通常使用“snake_case”而不是“camelCase”编写ᴏʟᴅsᴘᴇᴇᴅ 嘿,我觉得这特别令人愉快,因为snake->python:)为什么要加括号?请将所有代码以文本形式发布在这里。添加括号会有什么效果?圆括号试图像函数一样使用属性,也就是说,它试图像函数一样调用属性。正如错误所述,
s.vals
是一个列表,它是不可调用的。顺便说一句,虽然这是一个很好的过程,但不幸的是它不符合典型的python约定。如果希望属性为“private”,请预先挂起下划线,
self.\u vals=[]
。这是约定的隐私,实际上没有人被阻止访问您的属性。但是使用您的代码库的人知道“这是一个实现细节,不是一个保证,不要使用它,如果您这样做了,就知道您不能依赖这种行为”。此外,Python通常使用“snake_case”而不是“camelCase”编写ᴏʟᴅsᴘᴇᴇᴅ 呵呵,我觉得它特别令人愉快,因为蛇->蟒蛇:)很好听。如果你能投赞成票和/或接受,那就太棒了:)很高兴听到。如果你可以投票和/或接受这一点,那就太棒了:)不要使用双下划线名称。这不是它的目的,使用一个下划线。我知道:-)事实上,单个下划线不会创建名称的屏蔽。如果您将单个
\uuu
,它看起来像是OOP语言中受保护的成员。私人会员的真正方式是使其具有双重身份。@juanpa.arrivillaga是正确的。这不是双下划线名称mangling的用途。简而言之,它用于避免子类之间的命名冲突。除此之外,
self.vals
确实没有理由是私有的。在Python中,让getter和setter完全脱离惯例通常是不受欢迎的。不,这是Java/C++关于将修饰符访问到一种根本不支持它们的语言中的想法。在Python世界中,您所说的双下划线名称混乱是“让子类使用这个名称,而不隐藏父属性”。Python不是Java。不要像Java那样编写Python。@ChristianDean完全正确!拥有属性的全部意义在于,除非您需要它们,否则您不会编写它们。如果您编写的属性只返回self.\u属性,那么您可能一开始就不需要它。只需使用
self.attribute
。如果以后需要更改访问/设置
self.attribute
的方式,请使用该属性。这就是属性的美妙之处,我们不必编写愚蠢的getter/setter样板。请参见教程。请勿使用双下划线名称。这不是它的目的,使用一个下划线。我知道:-)事实上,单个下划线不会创建名称的屏蔽。如果您将单个
\uuu
,它看起来像是OOP语言中受保护的成员。私人会员的真正方式是使其具有双重身份。@juanpa.arrivillaga是正确的。这不是双下划线名称mangling的用途。简而言之,它用于避免子类之间的命名冲突。除此之外,
self.vals
确实没有理由是私有的。在Python中,让getter和setter完全脱离惯例是非常重要的