Python中如何实现'is'关键字?
... is可以用于平等的关键字. >>> s = 'str' >>> s is 'str' True >>> s is 'st' False 我尝试了__is__()和__eq__(),但它们不起作用. >>> class MyString: ... def __init__(self): ... self.s = 'string' ... def __is__(self, s): ... return self.s == s ... >>> >>> >>> m = MyString() >>> m is 'ss' False >>> m is 'string' # >> >>> class MyString: ... def __init__(self): ... self.s = 'string' ... def __eq__(self, s): ... ret
8 2024-04-05
编程技术问答社区
为什么__dict__和__weakref__级别从未在Python中重新定义?
class创建似乎永远不会 re - 定义__dict__和__weakref__ class 属性(即,如果它们已经存在于超级类的字典中,则它们是未添加到其子类的字典中),而是始终 re - 定义__doc__和__module__ class 属性.为什么? >>> class A: pass ... >>> class B(A): pass ... >>> class C(B): __slots__ = () ... >>> vars(A) mappingproxy({'__module__': '__main__', '__dict__': , '__weakref__': , '__doc__': None}) >>> vars(B
16 2024-03-19
编程技术问答社区
为什么 __setattr__ 和 __delattr__ 在这种情况下会引发一个 AttributeError?
在python中,object.__setattr__ and type.__setattr__在属性更新过程中提高AttributeError的基本原理是什么,如果该类型具有属性 data >没有__set__方法的描述符?同样,object.__delattr__和type.__delattr__在属性删除期间提高AttributeError的基本原理是什么,如果该类型具有 data descriptor的属性 __delete__方法? 我之所以问这个是数据描述符,没有__get__方法. 这是一个简单的程序,一方面说明了object.__getattribute__的属性查找之间的差异(不提高AttributeError),以及object.__setattr__>属性更新,另一方面属性删除属性删除(另一方面)( AttributeError提高): class DataDescriptor1: # missing __get__ def __set_
6 2024-03-19
编程技术问答社区
python属性查询过程是如何进行的?
当我说" python属性查找proccess"时,我的意思是:python写x.foo ?? 时会做什么 搜索网络,我没有找到很多文档,这是我发现的最好的论文之一,它恢复了以下步骤(您可以看到全文 如果attrname是一个特殊(即Python提供的)属性,请返回. 检查objectName .__类__.__ dict __ for attrname.如果它存在并且是数据描述符,请返回描述符结果.搜索objectName .__ class__的所有基础以查看同一情况. 检查objectName .__ dict __ intername,如果找到了,请返回.如果objectname是一类,请搜索其基础.如果它是一个类,并且存在描述符或其基础中的描述符,请返回描述符结果. 检查objectName .__类__.__ dict __ for attrname.如果存在并且是非数据描述符,请返回描述符结果.如果它存在,并且不是描述符,请返回它.如果它存在并且是数据描述符,我们
6 2024-03-18
编程技术问答社区
在__getitem__中实现分片
我正在尝试为创建向量表示的类实现切片功能. 我到目前为止拥有此代码,我相信它将正确实现切片,但是每当我做类似v[4]的事情时,v是向量,Python都会出现关于没有足够参数的错误.因此,我试图弄清楚如何定义我的班级中的特殊方法来处理普通索引和切片. def __getitem__(self, start, stop, step): index = start if stop == None: end = start + 1 else: end = stop if step == None: stride = 1 else: stride = step return self.__data[index:end:stride] 解决方案 __getitem__()方法将对象切成薄片时将接收slice对象.只需查看slice slice对象的start,stop和s
74 2023-09-04
编程技术问答社区
什么情况下 dict_values 视图可以类似于 set(为什么)?
文档说>>> d = {1: 1} >>> d.values() | d.keys() {1} >>> d.values() & d.keys() {1} >>> d.values() - d.keys() set() 为什么要实现设置 - 返回设置语义,却用 实际设置失败? >>> d.values() - {1} TypeError: unsupported operand type(s) for -: 'dict_values' and 'set' 解决方案 这实际上不是dict_values处理操作. keys_view将通过支持反映的方法来强臂从右侧进行操作: >>> set().__rsub__({}.values()) NotImplemented >>> {}.keys().__rsub__({}.values()) set() 出于类似的原因,设置操作有时会与其他dict视图一起使用或不使用: # works, because type
4 2023-08-31
编程技术问答社区
Python类的__hash__方法和设置
我正在使用set()和__hash__ python类的方法来防止在集合中添加相同的哈希对象.根据 python data-model文档,set(),set()哈希对象作为同一对象,然后添加一次. ,但其行为与以下不同: class MyClass(object): def __hash__(self): return 0 result = set() result.add(MyClass()) result.add(MyClass()) print(len(result)) # len = 2 在字符串值时,它可以正常工作. result.add('aida') result.add('aida') print(len(result)) # len = 1 我的问题是:为什么相同的哈希对象在集合中不一样? 解决方案 您的阅读不正确. __eq__方法用于平等检查.文档只是指出,__hash__值也必须相同,对于a和b,
22 2023-08-30
编程技术问答社区
循环处理Python/IronPython对象的方法
在Python对象的方法上循环并称呼它们的正确方法是什么? 给定对象: class SomeTest(): def something1(self): print "something 1" def something2(self): print "something 2" 解决方案 您可以使用Inspect模块获取类(或实例)成员: >>> class C(object): ... a = 'blah' ... def b(self): ... pass ... ... >>> c = C() >>> inspect.getmembers(c, inspect.ismethod) [('b', >)] getMembers()返回一个元组列表(名称,成员). GetMembers()的
14 2023-08-04
编程技术问答社区
制作 python 装饰器类的精简接口
我一直在寻找以对象为导向的设置来制作装饰工厂.可以在中找到一个简单的版本.但是我对界面的简单性并不完全满意. 我设想的一种界面将使用特殊类Decora我可以使用的Decora: class MultResult(Decora): mult: int = 1 i_am_normal = Literal(True) # will not be included in the __init__ def __call__(self, *args, **kwargs): # code for the wrapped functoin return super().__call__(*args, **kwargs) * self.mult 这将导致以下行为: >>> @MultResult(mult=2) ... def f(x, y=0): ... return x + y ... >>> >>> signature(Mu
12 2023-07-25
编程技术问答社区
如果实现__getattribute__,是否有办法访问形式参数?
似乎__getattribute__只有2个参数(self, name). 但是,在实际代码中,我截然的方法实际上是参数. 无论如何是否有访问这些参数? 谢谢, charlie 解决方案 __ getAttribute __ 简单地返回所请求的属性,以防一种方法,然后使用 __调用__ 接口来调用它. ,而不是返回该方法,例如,围绕它返回包装器,例如: def __getattribute__(self, attr): def make_interceptor(callble): def func(*args, **kwargs): print args, kwargs return callble(*args, **kwargs) return func att = self.__dict__[attr] if callabl
48 2023-07-21
编程技术问答社区
何时、何地以及如何更改对象的 __class__ attr?
我希望能够做: >>> class a(str): ... pass ... >>> b = a() >>> b.__class__ = str Traceback (most recent call last): File "", line 1, in TypeError: __class__ assignment: only for heap types 解决方案 我已经以这种方式解决了它: >>> class C(str): ... def __getattribute__(self, name): ... if name == '__class__': ... return str ... else: ... return super(C, self).__getattribute__(name) ... >>>
16 2023-07-20
编程技术问答社区
要正确代理一个对象,需要实现哪些 Python dunder/magic 方法?
我正在尝试创建一个对象代理. 属性/属性查找可以通过简单地实现__getattribute__,__setattr__和__delattr__方法来完成. 但是,其他功能(例如len(x), x[], bool(x))需要实现其他dunder方法,例如__len__, __getitem__, __bool__.如果您不在代理类上实现这些功能,但是您要代理的对象支持它们,那么您的代理将不完整并导致运行时错误. 因此,我想列出我需要实施的所有内容,但我找不到任何可靠的列表. 这是我从typing和builtins模块中获得的97个独特的方法名称. 我知道他们中的很多事情,但是有些我不知道.为我的代理班实施所有或大多数人会很痛苦,所以如果有解决方法,我会很高兴. __abs__ __add__ __aenter__ __aexit__ __aiter__ __and__ __anext__ __await__ __bool__ __bytes__ __call__ __cl
10 2023-07-20
编程技术问答社区
对象相等 (`===`)的默认行为在哪里定义?
根据 object.__eq__()文档 (即,在object类中)==的实现如下: True if x is y else NotImplemented 仍然关注现在,以下代码打印False和True在Python 3.9中: class A: pass print(A() == A()) print(bool(NotImplemented)) 所以我的问题是:文档在哪里提到NotImplemented的特殊行为. ps:我在 cpython源代码,但我想这必须/应该在文档中的某个地方. 解决方案 根据object.__eq__()文档,==的默认值(即,在对象类中)的实现如下 否;那是__eq__ 的默认实现. ==作为运营商,不能在类中实现. Python的实施操作员是合作的.有硬编码的逻辑使用Dunder方法来弄清楚应该发生的事情,并且可能会落后于默认值.此逻辑不在任何类别. 您可以看到带有内置len的另一个示例:类可以从其__l
22 2023-07-18
编程技术问答社区
Python 数据模型和内置函数之间的关系是什么?
当我在堆栈溢出上阅读python答案时,我继续看到一些人告诉用户 to 使用数据模型的特别 属性直接. 然后,我看到矛盾的建议(有时是我自己的建议)说不要这样做,而是直接使用内置功能和操作员. 为什么? python 数据模型我应该什么时候使用特殊名称? 解决方案 python datamodel和内置功能之间有什么关系? 内置和操作员使用基础数据模型方法或属性. 内置和操作员的行为更优雅,并且通常更兼容. 数据模型的特殊方法是语义上的非公共接口. 内置和语言操作员专门打算是通过特殊方法实现的行为的用户界面. 因此,您应该在可能的情况下使用dataModel的特殊方法和属性时使用内置功能和运算符. 语义上的内部API比公共接口更可能更改.尽管Python实际上并没有考虑任何"私人"并揭露内部内容,但这并不意味着滥用访问权限是一个好主意.这样做有以下风险: 您可能会发现,升级Python可执行文件或切换到Python的其他实现(例如Pypy
22 2023-07-18
编程技术问答社区
如何检查python方法是否绑定?
给出了对方法的引用,是否有办法检查该方法是否绑定到对象?您还可以访问其限制的实例吗? 解决方案 def isbound(method): return method.im_self is not None def instance(bounded_method): return bounded_method.im_self 当用户定义的方法对象为 通过检索用户定义的 从类的功能对象, im_self属性是None, 方法对象被认为是未结合的. 当一个通过检索一个 用户定义的函数对象 通过其中一个实例上课 im_self属性是实例, 该方法对象被认为是绑定的. 无论哪种情况,新方法 im_class属性是从 检索发生的是 它的im_func属性是原始的 功能对象. in Python 实例方法对象有新 对象和函数的属性 包括该方法;新的同义词 对于im_self是__self__和im_func 也可作为__func__提供.老人 python
10 2023-07-17
编程技术问答社区
一切都大于 "无 "吗?
是否有python内置数据类型,除了None ,其中: >>> not foo > None True 其中foo是该类型的值? python 3? 解决方案 None始终小于Python 2中的任何数据类型(请参阅在Python 3中,这已更改;现在,在没有明智的自然顺序的情况下进行比较会导致A TypeError.源自 3.0 3.0"什么新更新"更新 : Python 3.0简化了订购比较的规则: 订购比较操作员(=,>)在操作数没有有意义的自然订购时提出TypeError例外.因此,诸如:0 > None,0 > None或len
42 2023-07-17
编程技术问答社区
在Python中获取对象的全限定类名
为了记录目的,我想检索Python对象的完全合格的类名称. (有了完全合格的我的意思是班级名称,包括包和模块名称.) 我知道x.__class__.__name__,但是有一种简单的方法可以获取软件包和模块吗? 解决方案 带有以下程序 #!/usr/bin/env python import foo def fullname(o): klass = o.__class__ module = klass.__module__ if module == 'builtins': return klass.__qualname__ # avoid outputs like 'builtins.str' return module + '.' + klass.__qualname__ bar = foo.Bar() print(fullname(bar)) 和Bar定义为 class Bar(object):
14 2023-07-17
编程技术问答社区
获取定义方法的类
如何获得在Python中定义方法的课程? 我希望以下示例打印" __main__.FooClass": class FooClass: def foo_method(self): print "foo" class BarClass(FooClass): pass bar = BarClass() print get_class_that_defined_method(bar.foo_method) 解决方案 import inspect def get_class_that_defined_method(meth): for cls in inspect.getmro(meth.im_class): if meth.__name__ in cls.__dict__: return cls return None 其他解决方案 我不知道为什么没有人提出过这个问题,或者为
20 2023-07-17
编程技术问答社区
获取实例的类名
如何找到用于在Python中创建对象实例的类的名称? 我不确定是否应该使用 inspect 模块或解析__class__属性. 解决方案 您是否尝试过班上? IE type(x).__name__将为您提供班级的名字,我认为这是您想要的. >>> import itertools >>> x = itertools.count(0) >>> type(x).__name__ 'count' 如果您仍在使用Python 2,请注意,上述方法可用于 new Style类仅(在Python 3+中,所有类都是"新样式"类).您的代码可能使用一些旧式类.以下适用于两者: x.__class__.__name__ 其他解决方案 您是否将班级的名称作为字符串? instance.__class__.__name__ 其他解决方案 type() ?? >>> class A: ... def whoami(self): ...
44 2023-07-15
编程技术问答社区
防止在__init__之外创建新的属性
我希望能够创建一个曾经使用__init__初始化的类(在Python中),不接受新属性,而是接受现有属性的修改.我可以看到有几种hack-ish方法可以做到这一点,例如使用__setattr__ 等方法 def __setattr__(self, attribute, value): if not attribute in self.__dict__: print "Cannot set %s" % attribute else: self.__dict__[attribute] = value ,然后直接在__init__内部编辑__dict__,但是我想知道是否有一种"正确"的方法? 解决方案 我不会直接使用__dict__,但是您可以添加一个函数以明确"冻结"一个实例: class FrozenClass(object): __isfrozen = False def __setattr__(se
16 2023-07-12
编程技术问答社区