- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我整天都为此奋斗,并做了很多Google搜索。我遇到的似乎是继承问题。
我有一个名为BaseClass的类,该类为我做一些简单的事情,例如设置日志记录默认值,保存日志和管理只读属性。过去,此类没有问题,但是我可以说我只使用python几个月了。此外,我认为有几个警告很重要:
过去的所有继承都是单一继承。换句话说,我已经继承了BaseClass,但是继承了BaseClass的类则没有被另一个类继承。在今天的问题中,我将BaseClass继承到BaseFormData中,然后将其继承到July2013FormData中,再将其继承到Jan2014FormData中。因此,显然现在有更多层。
我没有尝试在过去继承了BaseClass的任何类中覆盖__getattr__
或__getattribute__
。今天是。 BaseClass拥有自己的__getattribute__
方法,以管理只读属性的获取。 BaseFormData类具有__getattr__
方法,因为我读过这是提供对数据的访问的正确方法,而不必显式声明所有属性。正在加载的表单数据中包含十几个或更多数据(取决于版本),因此我明确声明了一些重要或别名的属性,而其余属性则由__getattr__
处理。
这是BaseClass中的__getattribute__
:
def __getattribute__(self, attr):
try:
# Default behaviour
return object.__getattribute__(self, attr)
except:
try:
return self.__READ_ONLY[attr]
except KeyError:
lcAttr = php_basic_str.strtolower(attr)
return self._raw[lcAttr]
self._raw
的行仅是因为继承BaseClass的类经常使用
_raw
。没有BaseClass要求的
_raw
。理想情况下,对
_raw
的引用只能出现在继承类的
__getattr__
或
__getattribute__
中。但是,我需要在BaseClass中使用
__getattribute__
才能使只读功能正常工作。
__getattr__
:
def __getattr__(self, name):
"""
Return a particular piece of data from the _raw dict
"""
# All the columns are saved in lowercase
lcName = s.strtolower(name)
try:
tmp = self._raw[lcName]
except KeyError:
try:
tmp = super(BaseFormData, self).__getattribute__(name)
except KeyError:
msg = "'{0}' object has no attribute '{1}'. Note that attribute search is case insensitive."
raise AttributeError(msg.format(type(self).__name__, name))
if tmp == 'true':
return True
elif tmp == 'false':
return False
else:
return tmp
File "D:\python\lib\mybasics\mybasics\cBaseClass.py", line 195, in __getattribute__
return self.__READ_ONLY[attr]
RuntimeError: maximum recursion depth exceeded while calling a Python object
__getattr__
。其他时间我收到此递归错误。其他时间我可以使它工作,但是随后我添加了一些小东西,一切都再次中断了。
__getattribute__
和
__getattr__
的调用顺序,我显然缺少一些东西。今天,我已经做了很多代码调整,如果有内存可用的话,我在BaseFormData和BaseClass中都不会有
__getattribute__
,但是我不记得这个错误。
__getattr__
中的这一行:
tmp = super(BaseFormData, self).__getattribute__(name)
__getattribute__
以检查“只读”属性。
__getattr__
更改为
__getattribute__
,它似乎在BaseClass的
__getattribute__
之前运行,这很有意义。
__init__
和BaseFormClass的子类中发生的顺序所致。然后似乎是由于创建__READ_ONLY太晚了,我也修复了该问题。
_raw
在子类中不在BaseClass中,因此我在BaseClass的
_raw
中删除了对
_getattribute__
的任何引用。我接受了rchang关于将自我更改为对象的建议,这对BaseClass的
__getattribute__
有所帮助,但似乎在BaseFormData的问题中引起了问题。我已经使用以下代码从解释器中获取了“ get”部分:
def __getattribute__(self, attr):
try:
# Default behaviour
return object.__getattribute__(self, attr)
except:
return self.__READ_ONLY[attr]
def __getattribute__(self, name):
# All the columns are saved in lowercase
lcName = s.strtolower(name)
try:
# Default behaviour
return object.__getattribute__(self, name)
except:
try:
tmp = object.__getattribute__(self, '_raw')[lcName]
except KeyError:
try:
tmp = BaseClass.__getattribute__(self, name)
except KeyError:
msg = "'{0}' object has no attribute '{1}'. Note that attribute search is case insensitive."
raise AttributeError(msg.format(type(self).__name__, name))
if tmp == 'true':
return True
elif tmp == 'false':
return False
else:
return tmp
__getattribute__
问题。当我尝试覆盖只读属性时,将触发日志警告,但随后在调用
self.__instanceId
时失败。昨天该日志警告正常运行(当我可以使类实例化而没有错误时)。我可以像这样实例化该类:
a = Jan2014Lead(leadFile)
a.__instanceId
Out[7]: '8c08dee80ef56b1234fc4822627febfc'
File "D:\python\lib\mybasics\mybasics\cBaseClass.py", line 255, in write2log
logStr = "[" + self.__instanceId + "]::[" + str(msgCode) + "]::" + msgMsg
File "cBaseFormData.py", line 226, in __getattribute__
raise AttributeError(msg.format(type(self).__name__, name))
AttributeError: 'Jan2014Lead' object has no attribute '_BaseClass__instanceId'. Note that attribute search is case insensitive.
最佳答案
我认为您遇到了无限递归,因为__getattribute__
试图直接查找self的属性,因此导致__getattribute__
在除块之外的那些地方调用自身。看到这样的问题:
How is the __getattribute__ method used?
也许尝试以下方法(将与您在try块中使用的object.__getattribute__
相同的技术也扩展到except块)?
def __getattribute__(self, attr):
try:
# Default behaviour
return object.__getattribute__(self, attr)
except:
try:
# return self.__READ_ONLY[attr]
return object.__getattribute__(self, __READ_ONLY)[attr]
except KeyError:
lcAttr = php_basic_str.strtolower(attr)
# return self._raw[lcAttr]
return object.__getattribute__(self, _raw)[lcAttr]
关于python-2.7 - Python继承和__getattr__和__getattribute__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27265009/
__getattr__ 可用于定义对象的属性。例如。以下代码将返回'bar'。 class Test(object): def __getattr__(self, key):
我一直在尝试实现 __getattr__ 函数,如下例所示: PEP 562 -- Module __getattr__ and __dir__ 我不明白为什么这段简单的代码: # lib.py de
读一本书,我遇到了这段代码...... # module person.py class Person: def __init__(self, name, job=None, pay=0):
我遇到了内置的 __getattr__ 并且想知道什么时候可以使用它。我很难从文档中想到实际用途 http://docs.python.org/reference/datamodel.html# .什
我正在尝试找到一种方法来设置封装到 class 中的 dict 值,例如使用 __getattr__ 我可以返回内部 dict 值,但是即使属性存在,也会调用 __setattr__,这让我的实现变得
我想在类实例化期间更改 __getattr__。例如: class AttrTest(object): def __init__(self): self.__getattr__
这个问题在这里已经有了答案: How can I intercept calls to python's "magic" methods in new style classes? (4 个答案)
我必须自定义 __getattr__ 来调用另一个函数来读取。 除了 help(object.attr) 不起作用外,这很好用。此代码用于交互式环境,因此 help() 对我们来说变得很重要。 是否有
当未找到属性时,将调用 object.__getattr__。是否有等效的方法来拦截未定义的方法? 最佳答案 没有区别。方法也是一种属性。 (但是,如果您希望该方法有一个隐式的“self”参数,您将不
我的类(class)有一个字典,例如: class MyClass(object): def __init__(self): self.data = {'a': 'v1', '
如何在类、模块上实现 __getattr__ 的等价物? 示例 当调用一个模块的静态定义属性中不存在的函数时,我希望在该模块中创建一个类的实例,并在其上调用与在模块上的属性查找中失败的名称相同的方法.
如何覆盖 __getattr__一个类的方法而不破坏默认行为? 最佳答案 覆盖 __getattr__ 应该没问题 - __getattr__ 仅作为最后的手段调用,即如果实例中没有与名称匹配的属性。
感谢您花时间阅读本文。希望你在这些陌生的时刻一切都好。 我正在实现一个类并开始研究如何为其属性提供自动完成功能。从我的在线研究中,我得出的结论是 ipython 补全来自 __dir__ 方法。 __
对于 Thing 类,当我调用一个未定义的方法时,例如 .doamethod()... class Thing: def __init__(self): pass de
我有一个类,它是成员的容器。所有成员都属于同一类型。 class A(int): def __init__(self, n): super().__init__()
import random class Foo(object): def __init__(self): self._name = ''.join([chr(65 + rand
在《学习Python 3rd》中,我看到了这段代码 class wrapper: def __init__(self, object): self.wrapped = obje
在我的基于 Flask sqlalchemy 的应用程序中,我有一个这样的模型: class Foo(object): start_date = db.Column(db.DateTime()
正如标题所说。似乎无论我做什么,都不会调用 __getattr__。例如,我也尝试过(我知道这很荒谬),但不出所料没有回应。就好像 __getattr__ 在元类中被禁止了一样。 如果有任何关于此文档
这个问题在这里已经有了答案: Overriding special methods on an instance (5 个答案) 关闭 5 年前。 我现在正在从事一个项目,该项目处理抽象数学意义上的
我是一名优秀的程序员,十分优秀!