我创建了一个类,如下所示-
class child:
def __init__(self,lists):
self.myList = lists
def find_mean(self):
mean=np.mean(self.myList)
return mean
当我创建一个像下面这样的onject时——
obj=child()
它给出了错误-
TypeError: __init__() missing 1 required positional argument: 'lists'
如果我创建下面这样的对象,那么它工作得很好-
obj=child([44,22,55)
或者如果我创建下面这样的类-
class child:
def find_mean(self,myList):
mean=np.mean(myList)
return mean
然后我创建了下面这样的对象-
obj=child()
然后它也很好,但是我需要按照我一开始解释的方式来做。你能帮我理解一下上下文吗?
在第一个示例中,__init__
方法需要两个参数:
self
由Python自动填充lists
是一个你必须给它的参数。它会尝试将这个值分配给一个名为self.myList
的新变量,如果你不给它一个值,它就不知道应该使用什么值
在第二个示例中,您还没有编写__init__
方法。这意味着Python创建自己的默认__init__
函数,该函数不需要任何参数。但是,find_mean
方法现在要求您改为给它一个参数。
当你说你想按照一开始解释的方式创建它时,这实际上是不可能的:类需要一个值,而你没有给它一个值。
因此,我很难说出你真正想做什么。然而,有一种选择可能是,你想早点创建这个类,然后再添加一个列表。在这种情况下,代码看起来是这样的:
import numpy as np
class Child:
def __init__(self, lists=None):
self.myList = lists
def find_mean(self):
if self.myList is None:
return np.nan
mean = np.mean(self.myList)
return mean
此代码允许您更早地创建对象,并在稍后向其添加列表。如果您尝试调用find_mean
而不给它一个列表,它只会返回nan
:
child = Child()
print(child.find_mean()) # Returns `nan`
child.myList = [1, 2, 3]
print(child.find_mean()) # Returns `2`
问题顶部的代码定义了一个名为child
的类,该类有一个属性lists
,该属性是在__init__
方法中创建实例时分配的。这意味着在创建child
的实例时必须提供一个列表。
class child:
def __init__(self, lists):
self.myList = lists
def find_mean(self):
mean=np.mean(self.myList)
return mean
# works because a list is provided
obj = child([44,22,55])
# does not work because no list is given
obj = child() # TypeError
如果像第二个例子中那样创建类,则不再显式指定__init__
,因此,对象没有必须在实例创建时分配的属性:
class child:
def find_mean(self, myList):
mean=np.mean(myList)
return mean
# does not work because `child()` does not take any arguments
obj = child([44,22,55]) # TypeError
# works because no list is needed
obj = child()
要同时具有myList
属性,和不需要在创建时指定,唯一的方法是为其分配一个默认值:
class child:
def find_mean(self,myList=None):
mean=np.mean(myList)
return mean
# now this will work
obj = child()
# as will this
obj = child([24, 35, 27])