Python 这个代码正确吗
我有个问题要问。鉴于下面的代码,你能告诉我为什么在经理(或工人)班为什么吗Python 这个代码正确吗,python,Python,我有个问题要问。鉴于下面的代码,你能告诉我为什么在经理(或工人)班为什么吗 self.FirstName 给出与相同的结果 self._firstName 我会认为,self.\u firstName在两个类(经理/工人)中都不可访问,因为它是Employee类的本地类,不应在Employee类之外访问,不是吗 请建议 import gc class Employee(object): """Employee Base Class""" def __init__(self
self.FirstName
给出与相同的结果
self._firstName
我会认为,self.\u firstName
在两个类(经理/工人)中都不可访问,因为它是Employee类的本地类,不应在Employee类之外访问,不是吗
请建议
import gc
class Employee(object):
"""Employee Base Class"""
def __init__(self, FirstName, LastName,Age, Role):
super(Employee, self).__init__()
self._firstName = FirstName
self._lastName = LastName
self._age = Age
self._role = Role
@property
def FirstName(self):
return self._firstName
@property
def Age(self):
return self._age
@property
def Role(self):
return self._role
@FirstName.setter
def FirstName(self, value):
self._firstName = value;
pass
@Role.setter
def Role(self, value):
self._role = value;
pass
class Manager(Employee):
"""Manager class"""
def __init__(self, FirstName,LastName,Age):
Employee.__init__(self,FirstName, LastName, Age, 'Manager')
# super(Manager, self).__init__()
def getParents(self):
"""Get parents of the class"""
print(gc.get_referrers(self))
pass
def ManagerInfo(self):
print("FirstName : " + self.FirstName)
print("Role : " + self.Role)
print("Age : " + str(self.Age))
class Worker(Employee):
"""docstring for Worker"""
def __init__(self, FirstName, LastName, Age):
Employee.__init__(self,FirstName, LastName, Age, 'employee')
def getParents(self):
"""Get parents of the class"""
print(gc.get_referrers(self))
pass
def WorkerInfo(self):
print("FirstName : " + self.FirstName)
print("Role : " + self.Role)
print("Age : " + str(self.Age))
pass
# manager = Employee('John','Doe' , 40, 'Manager')
# print("{0}'s age is {1} years.".format(manager.FirstName, manager.Age))
anEmp = Worker('WorkerName', 'LastName', 20)
aManager = Manager('John', 'Doe', 40)
print(anEmp.WorkerInfo())
print(anEmp.getParents())
print("----------------------------")
print(aManager.ManagerInfo())
print(aManager.getParents())
谢谢
为什么self.FirstName
给出与self相同的结果。\u FirstName
因为您将FirstName
定义为属性
返回self.\u FirstName
。你到底期望什么
我本以为self.\u firstName在两个类(Manager/Worker)中都不可访问,因为它是Employee类的本地名称
它不是“Employee类的本地”,它是Employee
实例的一个属性(它在Employee
类本身中不存在)
不应该在外面接近,不是吗
虽然在名称前面加上一个下划线表示实现属性(这不是公共API的一部分,在大多数主流语言中相当于“protected”),但它并不阻止对该属性的访问。实际上,Python中绝对没有强制执行访问限制,这完全是惯例(并且最终会对\uu伪私有名称造成名称混乱)
Python的理念是,我们都是同意的成年人,并且足够聪明,不会做愚蠢的事情,比如在不接受破坏封装的全部责任的情况下,弄乱清楚标记为实现属性的东西
您能告诉我我应该做什么,以确保用户只能使用setters而不是self设置值。\u firstName
其实你已经做过了。重新阅读上面的段落,我已经提到Python没有强制执行任何类型的访问限制self._firstname
的前缀是一个前导下划线,这是告诉“这是一个实现细节,不是API的一部分,你不应该弄乱这个属性,你甚至不应该知道它的存在,所以如果你弄乱了某个东西,对你来说太糟糕了,但你是靠自己的”
因此,如果在这种情况下,我有一些任意的逻辑,在设置setter之前操作setter中的值,那么如果用户只执行self.\u firstName而不是self.firstName,则更新的值将不可用
这种情况发生的可能性实际上相当低(这是一种轻描淡写的说法),但从理论上说,这是可能发生的但是这是完全不相关的,因为如果用户使用self.FirstName
,您会遇到同样的问题,因为它仍然会返回过时的值 可能更适合,但在发布前阅读他们的指导方针。为什么会投反对票??这个问题有问题吗??我还看到了其他要求评论的问题,这就是为什么我要求将其链接到@bruno。。谢谢你的宝贵意见。在这种情况下,您能告诉我应该做什么,以确保用户只能使用setters而不是self来设置值。\u firstName。很抱歉,我对python的理解有限。@bruno任何带有代码示例的文章/帖子/链接都会很有帮助。感谢您无法阻止对属性的访问。前导下划线提示该属性是执行细节,不应使用。够了。我们都是同意的成年人。@Gagan:对。当然,也有一些描述符可能有助于阻止访问。但最后一条规则是:如果有人想拦截程序的工作方式,他可以!有些人认为这是Python的弱点,大多数Python开发人员认为这是一种优势。