在__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
54 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,
14 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()的
6 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
8 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
36 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) ... >>>
6 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
4 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
6 2023-07-18
编程技术问答社区
Python 数据模型和内置函数之间的关系是什么?
当我在堆栈溢出上阅读python答案时,我继续看到一些人告诉用户 to 使用数据模型的特别 属性直接. 然后,我看到矛盾的建议(有时是我自己的建议)说不要这样做,而是直接使用内置功能和操作员. 为什么? python 数据模型我应该什么时候使用特殊名称? 解决方案 python datamodel和内置功能之间有什么关系? 内置和操作员使用基础数据模型方法或属性. 内置和操作员的行为更优雅,并且通常更兼容. 数据模型的特殊方法是语义上的非公共接口. 内置和语言操作员专门打算是通过特殊方法实现的行为的用户界面. 因此,您应该在可能的情况下使用dataModel的特殊方法和属性时使用内置功能和运算符. 语义上的内部API比公共接口更可能更改.尽管Python实际上并没有考虑任何"私人"并揭露内部内容,但这并不意味着滥用访问权限是一个好主意.这样做有以下风险: 您可能会发现,升级Python可执行文件或切换到Python的其他实现(例如Pypy
8 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
4 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
34 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):
2 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 其他解决方案 我不知道为什么没有人提出过这个问题,或者为
6 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): ...
32 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
2 2023-07-12
编程技术问答社区
Schrödinger'的变量:如果你要检查它的存在,__class__单元格会神奇地出现?
这里有一个惊喜: >>> class B: ... print(locals()) ... def foo(self): ... print(locals()) ... print(__class__ in locals().values()) ... {'__module__': '__main__', '__qualname__': 'B'} >>> B().foo() {'__class__': , 'self': } True 似乎仅提及__class__是由解析器明确检查的吗?否则我们应该得到 之类的东西 NameError: name '__class__' is not defined 的确,如果您修改仅检查键,即检查'__class__' in locals(),那么我们只能按
4 2023-07-12
编程技术问答社区
为什么 __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_
2 2023-07-05
编程技术问答社区
为什么Python没有" __req__"(反映的平等)方法?
我有一个小帮手课: class AnyOf(object): def __init__(self, *args): self.elements = args def __eq__(self, other): return other in self.elements 这让我可以做甜蜜的魔法: >>> arr = np.array([1,2,3,4,5]) >>> arr == AnyOf(2,3) np.array([False, True, True, False, False]) 不必使用列表理解(如np.array(x in (2,3) for x in arr中). (我维护一个UI,让(受信任的)用户输入任意代码,并且a == AnyOf(1,2,3)比对非技术精明用户的列表理解更可口.) 但是! 这只能以一种方式工作!例如,如果我要做AnyOf(2,3) == arr,那么我的AnyOf c
4 2023-06-26
编程技术问答社区
有什么办法可以分辨一个函数对象是lambda还是def?
考虑以下两个功能: def f1(): return "potato" f2 = lambda: "potato" f2.__name__ = f2.__qualname__ = "f2" 缺乏原始源代码,有没有办法检测f1是def,f2是lambda? >>> black_magic(f1) "def" >>> black_magic(f2) "lambda" 解决方案 您可以检查代码对象的名称.与函数的名称不同,代码对象的名称无法重新分配. lambda的代码对象的名称仍然为'': >>> x = lambda: 5 >>> x.__name__ = 'foo' >>> x.__name__ 'foo' >>> x.__code__.co_name '' >>> x.__code__.co_name = 'foo' Traceback (most recent call last): File "
4 2023-06-24
编程技术问答社区