首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python类只读属性(日期时间)

python类只读属性(日期时间)
EN

Stack Overflow用户
提问于 2018-01-24 21:56:16
回答 2查看 860关注 0票数 4

我知道将属性设置为私有的一种快速方法是在属性之前使用__ (后来更正了,因为这实际上是用于名称损坏,而不是访问的限制),或者使用@property。

但是,我发现对于python标准库模块,例如日期时间,这是一种不同的设置方式?

要解释我的问题,请访问日期时间的源代码

让我们以类timedelta为例:

代码语言:javascript
复制
class timedelta:
    ...
    ...
    ... 

timedelta.min = timedelta(-999999999)
timedelta.max = timedelta(days=999999999, hours=23, minutes=59, seconds=59,
                          microseconds=999999)
timedelta.resolution = timedelta(microseconds=1)

类属性是在类之外设置的?为什么?

如果我:

代码语言:javascript
复制
import datetime
d= datetime.timedelta(days=1, hours=12)
print(d)
print(d.max)  # >>> 999999999 days, 23:59:59.999999
print(type(d.max))  # >>> <class 'datetime.timedelta'>

d.max = 1000  # regardless of the reason, if I just want to do this
# >>> AttributeError: 'datetime.timedelta' object attribute 'max' is read-only

我想知道这个AttributeError 是从哪里来的?在源代码中的任何地方,我都无法发现将引发此错误消息?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-24 22:16:20

类属性是在类之外设置的?为什么?

当执行timedelta类的主体时,timedelta不存在。在创建类对象并可以单独使用之前,必须执行class timedelta:块中的所有代码。

我想知道这个AttributeError是从哪里来的?我在源代码中的任何地方都找不到这个错误消息会被引发吗?

datetime模块是用纯Python编写的,但试着用是一个速度更快的模块用C写的 (如果可以的话)。纯Python代码的工作方式与您预期的一样:

代码语言:javascript
复制
>>> import sys
>>> sys.modules['_datetime'] = None  # prevent the C module from loading
>>> from datetime import timedelta
>>> timedelta.min = 5
>>> timedelta.min
5

timedelta类将tp_flags设置为Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE。您只能设置包含标志的对象的属性。

票数 4
EN

Stack Overflow用户

发布于 2018-01-24 22:11:38

这不是CPython解释器使用的日期时间模块的源代码.由于性能原因,CPython源代码在C中实现了许多标准库。它们确实提供了Python专用的实现(例如,我认为PyPy在许多情况下都依赖于这种实现)。

datetime的源代码实际上在这里:

datetimemodule.c

访问在C级受到限制.

请注意,双下划线名称-mangling做名称-损坏,它不限制访问.

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

https://stackoverflow.com/questions/48432316

复制
相关文章

相似问题

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