我知道将属性设置为私有的一种快速方法是在属性之前使用__ (后来更正了,因为这实际上是用于名称损坏,而不是访问的限制),或者使用@property。
但是,我发现对于python标准库模块,例如日期时间,这是一种不同的设置方式?
要解释我的问题,请访问日期时间的源代码
让我们以类timedelta为例:
class timedelta:
...
...
...
timedelta.min = timedelta(-999999999)
timedelta.max = timedelta(days=999999999, hours=23, minutes=59, seconds=59,
microseconds=999999)
timedelta.resolution = timedelta(microseconds=1)类属性是在类之外设置的?为什么?
如果我:
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 是从哪里来的?在源代码中的任何地方,我都无法发现将引发此错误消息?。
谢谢!
发布于 2018-01-24 22:16:20
类属性是在类之外设置的?为什么?
当执行timedelta类的主体时,timedelta不存在。在创建类对象并可以单独使用之前,必须执行class timedelta:块中的所有代码。
我想知道这个AttributeError是从哪里来的?我在源代码中的任何地方都找不到这个错误消息会被引发吗?
datetime模块是用纯Python编写的,但试着用是一个速度更快的模块用C写的 (如果可以的话)。纯Python代码的工作方式与您预期的一样:
>>> import sys
>>> sys.modules['_datetime'] = None # prevent the C module from loading
>>> from datetime import timedelta
>>> timedelta.min = 5
>>> timedelta.min
5timedelta类将tp_flags设置为Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE。您只能设置包含标志的对象的属性。
发布于 2018-01-24 22:11:38
这不是CPython解释器使用的日期时间模块的源代码.由于性能原因,CPython源代码在C中实现了许多标准库。它们确实提供了Python专用的实现(例如,我认为PyPy在许多情况下都依赖于这种实现)。
datetime的源代码实际上在这里:
访问在C级受到限制.
请注意,双下划线名称-mangling做名称-损坏,它不限制访问.
https://stackoverflow.com/questions/48432316
复制相似问题