gpt4 book ai didi

python - 为什么 properties 是 Python 中的类属性?

转载 作者:太空狗 更新时间:2023-10-29 21:48:14 28 4
gpt4 key购买 nike

我正在阅读 Fluent Python 第 19 章 > 正确查看属性,我对以下单词感到困惑:

Properties are always class attributes, but they actually manage attribute access in the instances of the class.

示例代码是:

class LineItem:

def __init__(self, description, weight, price):
self.description = description
self.weight = weight # <1>
self.price = price

def subtotal(self):
return self.weight * self.price

@property # <2>
def weight(self): # <3>
return self.__weight # <4>

@weight.setter # <5>
def weight(self, value):
if value > 0:
self.__weight = value # <6>
else:
raise ValueError('value must be > 0') # <7>

根据我以前的经验,类属性属于类本身并由所有实例共享。但是这里的 weight 这个属性是一个实例方法,它返回的值在实例之间是不同的。它如何有资格成为类属性?不是所有实例的所有类属性都应该相同吗?

我觉得我理解有误,希望得到正确的解释。谢谢!

最佳答案

一个区别是因为当你在一个类上定义一个@property时,那个属性对象就变成了这个类的一个属性。而当您针对类的实例 定义属性时(在您的__init__ 方法中),该属性仅针对该对象存在。如果您这样做,这可能会造成混淆:

>>> dir(LineItem)
['__class__', ..., '__weakref__', 'subtotal', 'weight']

>>> item = LineItem("an item", 3, 1.12)
>>> dir(item)
['__class__', ..., '__weakref__', 'description', 'price', 'subtotal', 'weight']

请注意 subtotal weight 如何作为属性存在于您的类中。

我认为还值得注意的是,当您定义一个类时,会执行该类下的代码。这包括定义变量(然后成为类属性)、定义函数和其他任何内容。

>>> import requests

>>> class KindOfJustANamespace:
... text = requests.get("https://example.com").text
... while True:
... break
... for x in range(2):
... print(x)
...
0
1
>>> KindOfJustANamespace.text
'<!doctype html>\n<html>\n<head>\n <title>Example Domain...'

@decorator 就是“syntactic sugar”。如果与 function = property(function) 相同,则意味着 @property 覆盖函数。这也适用于在类内部定义的函数,但现在函数是类命名空间的一部分。

class TestClass:
@property
def foo(self):
return "foo"
# ^ is the same as:
def bar(self):
return "bar"
bar = property(bar)

Python 中对 property 的一个很好的解释可以在这里找到:https://stackoverflow.com/a/17330273/7220776

关于python - 为什么 properties 是 Python 中的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52162720/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com