首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么python属性()函数分配给类变量而不是实例变量?

为什么python属性()函数分配给类变量而不是实例变量?
EN

Stack Overflow用户
提问于 2022-03-07 17:59:55
回答 2查看 356关注 0票数 0

我正在学习python中的封装和抽象,我遇到了属性函数和装饰器。常见的例子是这样的情况。

代码语言:javascript
复制
class Celsius():
    def __init__(self, temperature = 0):
        self.set_temperature(temperature)

    def to_fahrenheit(self):
        return (self._temperature * 1.8) + 32

    def get_temperature(self):
        print("Getting value")
        return self._temperature

    def set_temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

    temperature = property(get_temperature,set_temperature)

我不明白为什么属性函数要将描述符分配给temperature而不是self.temperature。为实例而不是类创建getter或setter功能不是一种支持吗?

就像这样

代码语言:javascript
复制
self.temperature = property(get_temperature,set_temperature)

使用

代码语言:javascript
复制
test = Celsius()
pprint(test.__dict__)

返回实例对象只具有self._temperature属性(我们试图将其设置为私有)。使用pprint(Celsius.__dict__)返回的实际上是我们在使用对象时访问的具有温度属性的类,据我理解,这是没有意义的,因为我感兴趣的是为实例创建功能和访问实例属性,而不是类属性。

(预先谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-07 18:11:56

在这个方法之外没有自我。这是定义一个类属性。

@Barmar在上面有一个有用的评论。

常用的类函数参数selfcls在类函数之外不可用。在本例中,您定义的是类的静态成员。默认情况下,以这种方式定义的vars (如您的temperature =)是类的静态成员。

在这里看到一些关于静态成员的有用提示:Python中可以使用静态类变量吗?

但为什么语法是那样的。不应该将属性赋值给实例变量吗?

注意下面的内容。class_static_var = 4的行为类似于人们看待cls.class_static_var = 4的方式,但它与self.instance_var = 4并不相似。要定义实例var,可以使用__init__方法

代码语言:javascript
复制
class DemoClass:
    def __init__(self): 
        self.instance_var = 3
    class_static_var = 4
票数 0
EN

Stack Overflow用户

发布于 2022-03-07 18:50:55

您没有解释为什么您认为描述符必须在实例名称空间中,而是看上去是在文件上

描述符是定义__get__()__set__()__delete__()的任何对象。..。描述符仅在用作类变量时才能工作。在实例中,它们没有任何效果。

因此,要使property工作,它必须是类的成员,而不是实例。

如果您有一个描述符Descriptor和一个类Foo

代码语言:javascript
复制
class Foo:
    bar = Descriptor()

foo = Foo()

然后,描述符协议将在任何一个

代码语言:javascript
复制
Foo.bar

代码语言:javascript
复制
foo.bar

无论如何,这是件好事。每个实例都不需要携带对描述符的引用。就像方法一样,它将属于类,但是实例可以访问它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71385386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档