关于python类的init和Decorators

2024-09-29 23:19:01 发布

您现在位置:Python中文网/ 问答频道 /正文

当我了解python的“property”时,令我惊讶的是,输出结果与应该是的代码说明如下:

class HideX(object):
    def __init__(self,x):
        self.x = x
    def get_x(self):
        return ~self.__x
    def set_x(self,x):
        assert isinstance(x,int),\
        '"x" must be an integer!'
        self.__x = ~x
    x = property(get_x, set_x)


    inst = HideX(20)
    #inst.x = 20#

当它执行inst = HideX(20)时。我认为它将调用__init__(self,x),因此指令self.x = x将被执行。问题发生了。我认为它不会调用x = property(get_x, set_x),因为self.x在类的主体中(它在类的顶部) 只有在类外(如#….所示)我们才能访问x = property(get_x, set_x)我错了吗?你能理解我的意思吗?在

索夫德: 经过反复的测试,我惊奇地发现当我们执行inst = HideX(20)时,代码x = property(get_x, set_x) 将首先调用,而不是'init(self,x)'。完全出乎我的意料!!!(在java中,当我们创建一个实例时,类的init()将首先被调用,我想,也许我错了)

(1)你能给我解释一下这种内在机制吗?我是新手,谢谢你的耐心。在

以下代码是我复制的段:

^{pr2}$

但它不能正常运行 错误代码是:

File "<string>", line 21, in <module>
File "<string>", line 4, in __init__
AttributeError: can't set attribute

(2)这本书错了吗??当我删除@property并添加代码'x=property(**x())'时,它就起作用了!!!在

你能给我解释一下原因吗?非常感谢


Tags: 代码inselfgetstringobjectinitdef
1条回答
网友
1楼 · 发布于 2024-09-29 23:19:01

对于第一个问题,答案很简单,x是类的一个属性(不是类的对象/实例),它将在类被定义时(而不是在创建其对象时)进行计算。在

举个例子来说明这一点-

>>> class CA:
...     y = print("Hello")
...     def __init__(self):
...             print("Blah")
...
Hello
>>> c = CA()
Blah

如您所见,y的值是在定义类时计算的,它与类中的所有函数都是一样的,它们在类被定义时被定义,但是它们只在函数被调用时才被计算。在

另外,使用@property与property(**x())不同,当您使用后者时,**x()解析为-

^{pr2}$

然后这些位置参数用于为属性getter和{}设置getter和{},而{}注释用于定义属性x的getter

相关问题 更多 >

    热门问题