Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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中关于uuu get和uu call的混淆_Python - Fatal编程技术网

python中关于uuu get和uu call的混淆

python中关于uuu get和uu call的混淆,python,Python,请参见下面的简单示例: class Celsius(object): def __init__(self, value=0.0): self.value = float(value) def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value)

请参见下面的简单示例:

class Celsius(object):
    def __init__(self, value=0.0):
        self.value = float(value)
    def __get__(self, instance, owner): 
         return self.value 
    def __set__(self, instance, value):
         self.value = float(value)
    def __call__(self):
         print('__call__ called')

class Temperature(object):
    celsius = Celsius()
    def __init__(self):
       self.celsius1 = Celsius()


T = Temperature()
print('T.celsius:', T.celsius)
print('T.celsius1:', T.celsius1)

output
T.celsius: 0.0
T.celsius1: <__main__.Celsius object at 0x023544F0>
class摄氏度(对象):
定义初始值(自,值=0.0):
self.value=浮动(值)
定义获取(自身、实例、所有者):
回归自我价值
定义集(自身、实例、值):
self.value=浮动(值)
定义呼叫(自我):
打印(“调用调用”)
类温度(对象):
摄氏度=摄氏度()
定义初始化(自):
self.celsius1=摄氏度()
T=温度()
打印('摄氏温度:',摄氏温度)
打印('T.celsius1:',T.celsius1)
输出
摄氏温度:0.0
T.celsius1:
我想知道为什么它们的产量不同。
我知道
T.celsius
会调用
\uuuu get\uuuuu
T.celsius1
调用
\uu call\uuuuu
如果你尝试,你会看到同样的结果

print('T.celsius:', T.celsius)
print('T.celsius1:', T.celsius1.value)

来自:

以下方法仅在类的实例 包含该方法(所谓的描述符类)的 owner类(描述符必须在owner的类中 字典或为其父母之一的课堂字典)

因此,描述符(即,实现
\uuuuuu get\uuuuuuuu
\uuuuu set\uuuuuuuu
\uuuuuuu delete\uuuuuuu
的对象)必须是类的成员,而不是实例

更改如下:

Temperature.celsius2 = Celsius()

T = Temperature()
print('T.celsius:', T.celsius)
print('T.celsius1:', T.celsius1)
print('T.celsius2:', T.celsius2)
输出为:

T.celsius: 0.0
T.celsius1: <__main__.Celsius object at 0x7fab8c8d0fd0>
T.celsius2:, 0.0
T摄氏度:0.0
T.celsius1:
T.celsius2:,0.0
更多链接:


区别在于第一个属性是类属性,而第二个是实例属性

根据,如果实现了至少第一个
描述符
方法(
\uuuuu get\uuuu
\uuuu set\uuuu
\uuu delete\uuuu
)的对象保存在类属性中,则在访问时将调用其
\uu get\uuu
方法。对于实例属性,情况并非如此。你可以学到更多

只有当对象像函数一样被调用时,对象的
\uuuu调用\uuu
方法才会起作用:

>>> class Foo:
...    def __call__(self):
...        return "Hello there!"
...
>>> f = Foo()
>>> f() 
'Hello There!'

T.celcius
作为类
Temperature
的属性,因此它按预期返回T.celcius的
\uuuu get\uuuu
方法的结果

T.celsius1
是实例
T
的一个属性,因此它返回变量本身,因为描述符仅对新样式的对象或类调用


如果要执行
T.celsius()

的话,将使用
\uuu调用
方法,正如其他人所说,描述符实例将用作类属性

class Temperature(object):
    celsius = Celsius()
    def __init__(self):
       self.celsius1 = Celsius()
如果希望
self.celsius1
具有自定义行为,请重写方法:


所以,你自己回答了你自己的问题。非常好的问题。我必须检查文件。在我看来,这种行为相当混乱。我没有看到
\uuuu调用\uuuu
调用……请写下何时(以及为什么)将对象作为函数调用。@ProblemFactory,例如。将对象传递到
映射
过滤器
减少
功能中,以获得高级功能。智能动态调度。代码检测。猴子修补术。这个列表还在继续,继续,继续……Python语言的不一致性、复杂性和丑陋性也在继续
class Temperature(object):
    celsius = Celsius()
    def __getattr__(self, name):
       if name == 'celsius1':
           return ...