我沉迷于阅读图书馆。我喜欢他们的代码构建方式,美观,最重要:可读。我正试图通过这样做来学习。但是,有时这样的行:
something = property(lambda self: object())
抓住我的眼睛!
我在_socket.py
和这个班级里面:
class error(Exception):
""" Base class for I/O related errors. """
def __init__(self, *args, **kwargs): # real signature unknown
pass
@staticmethod # known case of __new__
def __new__(S, *more): # real signature unknown; restored from __doc__
""" T.__new__(S, ...) -> a new object with type S, a subtype of T """
pass
def __reduce__(self, *args, **kwargs): # real signature unknown
pass
def __str__(self): # real signature unknown; restored from __doc__
""" x.__str__() <==> str(x) """
pass
characters_written = property(lambda self: object()) # default
errno = property(lambda self: object()) # default
filename = property(lambda self: object()) # default
strerror = property(lambda self: object()) # default
授予好奇心超过了包含lambda
的最后4行。问题是:它是如何工作的?他们的意思是什么,结果如何?你能用简单的方法展示一下这个陈述的例子吗?
谢谢你!
答案 0 :(得分:2)
首先,我建议阅读the python documentation about properties。它们通常用于创建伪属性。
errno = property(lambda self: object()) # default
在您的情况下,您只为此属性定义了一个getter(没有删除器的setter),因此errno
是只读的。在每次阅读时,它都会返回一个全新的object
。这可能不是很有意义,但库的其余部分可能期望有一个errno
变量。
答案 1 :(得分:1)
property
is a built-in。它通常用作装饰器。该代码与此相当,可能看起来更为熟悉:
class error(Exception):
#...
@property
def characters_written(self):
return object()
@property
def errno(self):
return object()
@property
def filename(self):
return object()
@property
def strerror(self):
return object()
尽管如此,它看起来并不是特别有用。这意味着每次尝试在此错误类的实例上检索任何这些属性时,您将获得一个新的唯一对象实例。
答案 2 :(得分:0)
它们看起来更像是占位符 - 可能是不受支持的实现。他们返回无用的东西。当你需要一个非None值时,它们似乎是合适的。