gpt4 book ai didi

python - 为什么类中函数名和变量名不能叫同一个?

转载 作者:行者123 更新时间:2023-12-03 05:31:06 24 4
gpt4 key购买 nike

我的代码目前如下所示:

class Employee:

def __init__(self, first, last):
self.first = first
self.last = last
self.email = first + '.' + last + '@email.com'

def email(self):
return '{}.{}@email.com'.format(self.first, self.last)

def fullname(self):
return '{} {}'.format(self.first, self.last)

emp_1 = Employee('John', 'Smith')

emp_1.first = 'Jim'

print(emp_1.first)
print(emp_1.email())
print(emp_1.fullname())

我的输出给出:

Jim
Traceback (most recent call last):
File "/home/djpoland/python-files/test.py", line 19, in <module>
print(emp_1.email())
TypeError: 'str' object is not callable

我了解可以通过删除 self.email 或更改电子邮件功能的名称来解决此问题。但是,为什么变量名和函数不能同名呢?这只是 Python 标准约定还是这个问题有内部原因?我尝试用谷歌搜索原因,但找不到任何信息。

最佳答案

因为在Python中类成员的内部表示是一个字典__dict__它包含所有方法和实例变量的名称。并且因为字典中的键必须是唯一的,所以它们不能相同。本质上方法和变量共享相同的命名空间(如下所示)

准确地说__dict__存储实例变量,仅当未找到给定键时,它才会搜索类变量,其中方法也存储在名为 __dict__ 的变量中.

所以如果你这样做:

class Employee:

def __init__(self, first, last):
self.first = first
self.last = last

def email(self):
return '{}.{}@email.com'.format(self.first, self.last)

def fullname(self):
return '{} {}'.format(self.first, self.last)

emp1 = Employee("John","Doe")
print(emp1.__dict__)

您将得到{'first': 'John', 'last': 'Doe'}

因此搜索进入类变量:

 print(Employee.__dict__)

{'__module__': '__main__', '__init__': <function Employee.__init__ at 0x03933468>, 'email': <function Employee.email at 0x03933420>, 'fullname': <function Employee.fullname at 0x039333D8>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>, '__doc__': None}

在哪里找到 key email分配给一个函数并调用它。

但是如果你的类包含该字段:

员工类别:

def __init__(self, first, last):
self.first = first
self.last = last
self.email = "ple@ple.pl"

def email(self):
return '{}.{}@email.com'.format(self.first, self.last)

def fullname(self):
return '{} {}'.format(self.first, self.last)

print(emp1)
{'first': 'John', 'last': 'Doe', 'email': 'ple@ple.ple'}

搜索停止

正如 @Max 指出的,如果方法具有相同的名称,则有可能访问该方法。然而,应该避免这种做法。我想不出这样的解决方案有效的例子。

关于python - 为什么类中函数名和变量名不能叫同一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51544505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com