猿问

类型错误:缺少 1 个必需的位置参数:“self”与导入期间作为别名

self我是在另一个 python 文件中定义和调用函数的新手。我正在使用Python 3.7。假设我有两个 python 文件,一个包含类(name.py),另一个在另一个文件(test.py)中调用此类函数。我试图理解为什么 python 在 Try#1 中显示错误,但在 #2 中却没有显示错误?Try#1 定义为别名,但这有什么作用呢?好像没有初始化吧?


具有类函数的主文件:name.py


class NameEmployee:


    def __init__(self):

        pass


    def first_name(self,x):

        return print('Hello ',x,'!')

要运行的文件:test.py


尝试#1:不起作用


from names import NameEmployee as ne

ne.first_name(x = 'John') 

结果 --> TypeError:first_name() 缺少 1 个必需的位置参数:'self'


尝试#2:工作


from names import NameEmployee

ne = NameEmployee()

ne.first_name(x = 'John')

结果 --> 你好约翰!


饮歌长啸
浏览 112回答 1
1回答

小怪兽爱吃肉

重要的是要确定这与“别名”无关,而是简单的事实,即这两段代码不相等!让我们从简化第二次尝试开始。我们将简单地删除中间变量的使用,以获得:from names import NameEmployeeNameEmployee().first_name(x='John')现在,进行第一次尝试,让我们暂时删除别名:from names import NameEmployeeNameEmployee.first_name(x='John')现在您可以清楚地看到差异:第二次尝试实际上调用(使用这些())构造函数,从而隐式传递self新创建的实例。但是第一次尝试first_name直接从类调用该方法,而不是类的实例self,因此永远不会传递(NameEmployee().first_name(x='John')相当于NameEmployee.first_name(NameEmployee(), x='John')whileNameEmployee.first_name(x='John')就是它的本质 - 调用first_name而不传递self...)。让我们进行逆向工程:我们现在要调用构造函数,如 try 2:from names import NameEmployeeNameEmployee().first_name(x='John')现在我们要别名:from names import NameEmployee as nene().first_name(x='John')(请记住,别名只是名称替换)现在,如果您愿意,可以将对象分离到一个新变量:from names import NameEmployee as nename_employee = ne()name_employee.first_name(x='John')
随时随地看视频慕课网APP

相关分类

Python
我要回答