在python中获取类和实例的属性

2023-12-22

在 python 中工作下一个代码:

class MyClass(object):
    field = 1

>>> MyClass.field
1

>>> MyClass().field
1

当我想要自定义字段的返回值时,我使用下一个代码:

class MyClass(object):
    def __getattr__(self, name):
       if name.startswith('fake'):
           return name
       raise AttributeError("%r object has no attribute %r" %
                            (type(self).__name__, name))

>>> MyClass().fake
fake

But:

>>> MyClass.fake
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class MyClass has no attribute 'fake'

好的,对于类我可以使用下一个代码:

class MyClassMeta(type):
    def __getattr__(cls, name):
       if name.startswith('fake'):
           return name
       raise AttributeError("%r object has no attribute %r" %
                            (type(self).__name__, name))

class MyClass(object):
    __metaclass__ = MyClassMeta

>>> MyClass.fake
fake

But:

>>> MyClass().fake
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'fake'

为了解决这个问题,我使用下一个代码:

class FakeAttrMixin():
   def __getattr__(self, name):
       if name.startswith('fake'):
           return name
       raise AttributeError("%r object has no attribute %r" %
                            (type(self).__name__, name))

class MyClassMeta(type, FakeAttrMixin):
    pass

class MyClass(object, FakeAttrMixin):
    __metaclass__ = MyClassMeta

>>> MyClass.fake
fake

>>> MyClass().fake
fake

MyClass.fake将会通知__getattr__ with MyClass and fake论据。

MyClass().fake将会通知__getattr__ with MyClass实例和fake论据。

如果我实施就可以了__getattr__逻辑仅在我的 mixin 上并且不使用self争论。

我可以编写更漂亮的按类和实例解析的自定义值吗?为什么field值解析为MyClass.field and MyClass().field with MyClass(object): field = 1如果与以下内容比较,定义的效果会有所不同__getattr__方法?因为当我想要得到field它首先在实例中搜索,然后在课堂上搜索,但我不明白为什么__getattr__另一种方式工作。

类似问题:__getattr__ 在类上而不是(或以及)实例上 https://stackoverflow.com/questions/11559120/getattr-on-a-class-and-not-or-as-well-as-an-instance and 访问实例属性和类属性之间的区别 https://stackoverflow.com/questions/1304868/difference-between-accessing-an-instance-attribute-and-a-class-attribute.


不,如果您必须支持类和实例上的任意属性查找,那么您唯一的选择就是实现__getattr__元类和类上的 hook 方法,每个方法都支持对类和实例的查找。

这是因为特殊的钩子方法是always查看了类型,所以type(obj).__getattr__。因此,对于MyClass.fake元类__getattr__用来。看新式类的特殊方法查找 http://docs.python.org/2/reference/datamodel.html#new-style-special-lookup;我解释了为什么这是在之前的回答 https://stackoverflow.com/a/14102566.

简而言之,就你而言,MyClass.fake会翻译成MyClass.__getattr__('fake') and __getattr__那么是一个未绑定的方法期望two参数(self and name),这会失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在python中获取类和实例的属性 的相关文章

随机推荐

  • Java 中的 KDTree 实现

    我正在寻找 Java 中的 KDTree 实现 我已经进行了谷歌搜索 结果似乎很随意 实际上有很多结果 但它们大多只是一次性的小实现 我宁愿找到具有更多 生产价值 的东西 类似于 apache 集合或适用于 NET 的优秀 C5 集合库 我
  • PHP:将 preg_replace 与 htmlentities 一起使用

    我正在写一个RSS to JSON parser作为其中的一部分 我需要使用htmlentities 在描述标签内找到的任何标签上 目前 我正在尝试使用preg replace 但我有点挣扎 我当前的 非工作 代码如下所示 pattern
  • IE10 中的 LinkBut​​tons 不执行回发

    我正在尝试添加一个简单的LinkButton到 ASP NET 4 页面 但它没有调用postback在 IE10 中 代码如下所示 HTML
  • mysql返回更新结果

    我想从 mysql 数据库中选择一堆行并更新这些行的查看属性 这是一种 我已阅读这些 标志 最初我做了这样的事情 update select a b c from mytable where viewed 0 set viewed 1 这可
  • PostgreSQL 与 Postgres Plus

    有谁知道两者之间有什么实质性差异常规 PostgreSQL http www postgresql org and Postgres Plus http www enterprisedb com products postgres plus
  • 如何在 Django/Python 中自动填充 PDF 表单? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 PDF 表单 我想使用 Django Web 应用程序中的数据自动填充这些表单 然后提供给用户下载
  • config 文件夹中的 main.php 和 main-local.php 之间的区别?

    谁能解释一下两者之间的区别main php and main local php在配置文件夹中 为什么一个人拥有 local 而另一个则没有 你可以阅读配置和环境 https github com yiisoft yii2 app adva
  • Aspectj 覆盖方法的参数

    我正在开发一个方面 用于检查 setter 方法的参数并用 null 值覆盖空字符串 这是我到目前为止的状态 Before execution de foo entity set args java lang String public v
  • 在 VBA 中使用 .NET HashTable 返回类型

    我在 VB NET 中创建了一个 NET 库 并且有一个函数返回一个对象HashTable 我一直在寻找如何在 Excel VBA 中访问 HashTable 对象中的元素 但找不到解决方案 我是 VBA 新手 请原谅我 我已经寻找过 但找
  • Rails 5 Carrierwave 没有与图像匹配的路线

    我需要一些帮助 我正在使用 Rails 5 和 Carrierwave 上传图像 我遇到的问题是图像已保存但不会显示 我得到一个没有路由匹配的 GET 我将图像存储在 Rails root 的上传文件夹中 因为我不希望它们保存在公共环境中目
  • python pandas dataframe按日期条件切片

    我可以使用 python datetime 对象读取和切片 pandas 数据帧 但是我被迫只使用现有日期在索引中 例如 这有效 gt gt gt data
  • Android SQLITE非法状态异常[重复]

    这个问题在这里已经有答案了 我使用以下代码将项目添加到数据库 public static void insertQuestion Context c JSONArray jarr String search throws JSONExcep
  • 通过随机点绘制好看的贝塞尔曲线

    我使用 javascript 和 RaphaelJS 来通过随机点绘制一条平滑的线 并输出到 SVG 该线严格水平移动 不会沿 X 轴返回 目前 我正在使用三次贝塞尔曲线来绘制从一点到另一点的线 问题是 这条线看起来不够好 两条曲线在一个点
  • 在 Android Studio 3.2 中看不到 find-sample-code 选项

    In 文档 https developer android com studio write sample code inline他们讲述查找代码示例选项 导入示例 但我在 Android Studio 3 2 中看不到它们 在代码中 突出
  • 如何计算 QueryDSL 中结果组的数量?

    如何在 QueryDSL Java 中 中实现组计数 背景 我正在表上实现分页搜索 我想在返回结果之前对结果进行分组 除了平常的LIMIT x OFFSET y查询时 我还想接收总行数 这是一页的 简化的 SQL 查询 SELECT x y
  • const char[] 和 const char* 之间的区别

    So 本文 https glandium org blog p 2361正在讨论声明字符串文字的用法 例如const char foo foo 它以以下声明结束 const char foo foo 几乎从来都不是你想要的 相反 您想使用以
  • 如何使用 A-Star 或 Dijkstra 算法解决 15 个难题?

    我在一本人工智能书籍中读到 用于模拟或游戏中寻路的流行算法 A Star Dijkstra 也被用来解决著名的 15 谜题 谁能给我一些关于如何将 15 个拼图简化为节点和边图的指示 以便我可以应用其中一种算法 如果我将图中的每个节点视为游
  • 在 Reporting Services 2008 中显示时间

    我的报告中有一个表 其中有数据类型的列Time 7 现在我在 Reporting Services 2008 中正确格式化它们时遇到问题 如果我将表达式的格式设置为 HH mm 它仍然显示11 12 000 我只想得到小时和分钟 喜欢11
  • 选择一个工具来创建/维护自定义 Eclipse 发行版

    我想选择一个工具来创建 维护我的自定义 eclipse distrib 从下一个 3 6 开始 通过研究之前的问题 主要竞争者似乎是 Pulse http www poweredbypulse com Yoxos http ondemand
  • 在python中获取类和实例的属性

    在 python 中工作下一个代码 class MyClass object field 1 gt gt gt MyClass field 1 gt gt gt MyClass field 1 当我想要自定义字段的返回值时 我使用下一个代码