Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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 - Fatal编程技术网

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开发人员认为这是一种优势。