如何创建类属性? [复制]

2024-06-23

在 python 中,我可以使用以下方法向类添加方法@classmethod装饰师。是否有类似的装饰器可以向类添加属性?我可以更好地展示我在说什么。

class Example(object):
   the_I = 10
   def __init__( self ):
      self.an_i = 20

   @property
   def i( self ):
      return self.an_i

   def inc_i( self ):
      self.an_i += 1

   # is this even possible?
   @classproperty
   def I( cls ):
      return cls.the_I

   @classmethod
   def inc_I( cls ):
      cls.the_I += 1

e = Example()
assert e.i == 20
e.inc_i()
assert e.i == 21

assert Example.I == 10
Example.inc_I()
assert Example.I == 11

我上面使用的语法是否可行,或者是否需要更多内容?

我想要类属性的原因是这样我可以延迟加载类属性,这似乎很合理。


我将这样做:

class ClassPropertyDescriptor(object):

    def __init__(self, fget, fset=None):
        self.fget = fget
        self.fset = fset

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        return self.fget.__get__(obj, klass)()

    def __set__(self, obj, value):
        if not self.fset:
            raise AttributeError("can't set attribute")
        type_ = type(obj)
        return self.fset.__get__(obj, type_)(value)

    def setter(self, func):
        if not isinstance(func, (classmethod, staticmethod)):
            func = classmethod(func)
        self.fset = func
        return self

def classproperty(func):
    if not isinstance(func, (classmethod, staticmethod)):
        func = classmethod(func)

    return ClassPropertyDescriptor(func)


class Bar(object):

    _bar = 1

    @classproperty
    def bar(cls):
        return cls._bar

    @bar.setter
    def bar(cls, value):
        cls._bar = value


# test instance instantiation
foo = Bar()
assert foo.bar == 1

baz = Bar()
assert baz.bar == 1

# test static variable
baz.bar = 5
assert foo.bar == 5

# test setting variable on the class
Bar.bar = 50
assert baz.bar == 50
assert foo.bar == 50

我们打电话时设置器没有工作Bar.bar,因为我们正在调用TypeOfBar.bar.__set__,这不是Bar.bar.__set__.

添加元类定义可以解决这个问题:

class ClassPropertyMetaClass(type):
    def __setattr__(self, key, value):
        if key in self.__dict__:
            obj = self.__dict__.get(key)
        if obj and type(obj) is ClassPropertyDescriptor:
            return obj.__set__(self, value)

        return super(ClassPropertyMetaClass, self).__setattr__(key, value)

# and update class define:
#     class Bar(object):
#        __metaclass__ = ClassPropertyMetaClass
#        _bar = 1

# and update ClassPropertyDescriptor.__set__
#    def __set__(self, obj, value):
#       if not self.fset:
#           raise AttributeError("can't set attribute")
#       if inspect.isclass(obj):
#           type_ = obj
#           obj = None
#       else:
#           type_ = type(obj)
#       return self.fset.__get__(obj, type_)(value)

现在一切都会好起来的。

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

如何创建类属性? [复制] 的相关文章

  • 如何在不在 iPython 笔记本中使用离线模式下的plotly进行绘图?

    我需要使用plotly绘制我的数据 但是这段代码没有给我任何结果 我显示我的数据 但没有任何数字 import plotly graph objs as go from plotly offline import download plot
  • del 在 Python 中什么时候有用?

    我实在想不出为什么 Python 需要del关键字 大多数语言似乎没有类似的关键字 例如 我们可以分配一个变量 而不是删除一个变量None到它 当从字典中删除时 del可以添加方法 有理由保留吗del在Python中 还是Python前垃圾
  • ResultSet 对象没有属性“find_all”

    当我抓取一个网页时 我总是遇到一个问题 AttributeError ResultSet 对象没有属性 find 您可能将项目列表视为单个项目 当您打算调用 find 时 您是否调用了 find all 谁能告诉我如何解决这个问题 我的代码
  • 在tensorflow中使用估计器API进行训练时出错

    我正在尝试运行一个简单的SVM通过使用 input fn 返回一个数据来对 iris 数据集进行分类tf data dataset对象 但我遇到了以下错误 Traceback most recent call last File tf te
  • 自定义 C# 对象可以包含与其自身类型相同的属性吗?

    如果我创建了以下内容Employee对象 简化 public class Employee public Employee public String StaffID get set public String Forename get s
  • 使用 JSON 将数据从 Python 导出到 Tableau?

    如何以表格形式从 Python 获取 400 万行和 28 列 我假设 基于搜索 我应该使用 JSON 格式 这种格式可以处理大量数据并且足够快 我制作了 12 行数据的子集并尝试使其正常工作 好消息是 它正在发挥作用 坏消息 不是我想要的
  • 为什么这个“[::-1]”在Python中返回一个反向列表? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 切片表示法的良好入门指南 https stackoverflow com questions 509211 good primer for python slice notation P
  • 如何针对 Heroku 路由器的代理/缓冲情况优化 uWSGI?

    我在 Heroku 的生产中使用 uWSGI 已有一年多了 它似乎比 Gunicorn 处理所有事情都要好得多 随着我们的流量扩大 我试图更好地理解heroku的路由器和uWSGI之间的接口 以优化和防止问题 但它对我来说仍然相当不透明 我
  • Tastypie:GET 的身份验证和 POST 的匿名

    我使用 Django Tastypie 来管理我的用户集合 是否可以允许匿名用户在 API 中发布 在某个端点创建新用户时 并限制经过身份验证的用户仅获取自己的用户 而不是所有用户 感谢您的帮助 我发现最简单的事情就是对我正在使用的身份验证
  • ibapi nextValidId 并不总是被调用

    我构建了一个小型 ibapi python 应用程序来运行一些策略 同时注意保持与 tws 的连接 如果 tws 处于非活动状态 python 应用程序将启动并等待 并在 tws 启动时连接到 tws 但这是我的问题 nextValidId
  • 对训练和测试数据帧使用相同的标签编码器

    我有 2 个不同的 csv 其中包含训练数据和测试数据 我从这些 train features df 和 test features df 创建了两个不同的数据帧 请注意 测试和训练数据有多个分类列 因此我需要对它们应用 labelEnco
  • 如何使用 BeautifulSoup 排除表中的某些行?

    我已经从表格中获得了所需的数据 但不想要各个玩家统计数据之间的缩写 Rk Pos Name 等 如何在保留所需数据的同时排除这些数据 包含缩写的行被归类为 thead 但我不知道如何使用该信息来跳过它 我知道玩家的数据都被压缩在一起 但现在
  • 如何设置 pandas DataFrame _repr_html_ 方法的默认样式?

    我有一个 pandas DataFrame 其中有一列是 url 并且我编写了以下格式化程序以将其作为链接呈现在我的笔记本中 def make clickable val target blank to open new window re
  • Python 中 Javascript 的 reduce()、map() 和 filter() 的等价物是什么?

    Python 的等价物是什么 Javascript function wordParts currentPart lastPart return currentPart lastPart word Che mis try console l
  • 使用 Python for PyQt WebEngine 授予对 Cam & Mic 的访问权限

    我正在构建一个从 Python 调用的简单 Web 应用程序 我正在使用下面的代码 加载此页面时 以编程方式授予对摄像头和麦克风的访问权限的最简单方法是什么 我只在网上找到了 C 示例 无法找到在 Python 代码中执行此操作的方法 fr
  • 如何在 python setup.py 中 chmod 文件?

    我使用 setup py 创建了一个 python 包安装 我希望它复制文件夹 为临时创建的 did 中的数据文件 问题是我必须使用 sudo 权限调用 setup py 因为它写入 usr local 因此 当我的数据文件复制到 did
  • MySQL:进行基本搜索

    我的数据库中有一个名称表 我希望对其进行模糊搜索 例如我的数据库包含 Name ID John Smith 1 Edward Smith 2 Gabriel Gray 3 Paul Roberts 4 目前 当我通过 python 搜索数据
  • Android Systrace 没有这样的文件或目录

    这是错误消息 D Programming Tools ADT bundle sdk platform tools systrace gt python systrace py Traceback most recent call last
  • 检查Python multiprocessing.Connection 的实例吗?

    Connection对象是在打开时创建的multiprocessing Pipe 然而 尚不清楚如何检查一个对象是否是一个实例Connection 在Python3 3 4 3 3 3 2 中 检测Connection我可以 from mu
  • python chaco轴标签时间格式

    在 Enthought 的 Chaco 中 TimeFormatter类用于格式化刻度的时间字符串 标签 有没有办法指定时间格式 类似于time strftime 源代码现在将显示月份和日期时的格式硬编码为美国风格 MMDD 我想添加一些灵

随机推荐

  • Windows 中的 Pipe fork 和 execvp 类似物

    这是在 unix 中使用 pipeline fork exec trio 的简单演示 include
  • 外部合并后保留 Dataframe 列数据类型

    当您使用 外部 合并在某些值上合并两个索引数据帧时 python pandas 会自动将 Null NaN 值添加到它无法匹配的字段 这是正常行为 但它会更改数据类型 您必须重新说明列应具有的数据类型 fillna or dropna 合并
  • LESS:最好使用继承或多个类

    我有一个 LESS 文件 其中包含inputbase 班级 我经常使用它 但不是每种输入类型 当我编译时 输出的 CSS 文件中有很多重复的样式 我研究了 bootstrap 如何在他们的网格中使用 LESS 他们使用了相同的方法 在哪里c
  • set_intersection 出现“向量迭代器不可递增”运行时错误

    为什么此代码会导致运行时错误 向量迭代器不可递增 vector
  • Java在嵌入式编程中的应用

    java编程可以像C C 一样用于微控制器编程吗 如果是的话 有什么要求吗 PIC16和PIC32系列微控制器呢 对他们来说有任何可能 我在网上也找不到更多有关它的信息 感谢您的帮助 干杯 要在任何平台上运行 Java 您都需要 Java
  • 如何在 SQL 中刷新 PRINT 缓冲区?

    我在 SQL Server 2005 中有一个运行时间非常长的存储过程 我正在尝试调试它 并且我使用 print 命令来执行它 问题是 我只是在存储过程的最后从 SQL Server 获取消息 我希望能够刷新消息缓冲区并在存储过程的运行时立
  • 返回游标数组不显示任何结果

    我试图通过这样做来解决两个集合的 连接 foundUsers function var searchUser Session get searchUser user search criteria var usf User find sea
  • php 解析 xml 字符串 [重复]

    这个问题在这里已经有答案了 可能的重复 PHP 的最佳 XML 解析器 https stackoverflow com questions 188414 best xml parser for php 我有一个包含 XML 数据的字符串 我
  • MVC3 - HiddenFor 字典值

    我有一个名为 Week 的字典属性 public IDictionary
  • C++ 应该消除头文件吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 许多语言 例如Java C 没有将声明与实现分开 C 有分部类的概念 但实现和声明仍然保留在同一个文件中 为什么C 没有相同的模型 有头文件更实
  • SIFT 泰勒展开计算子像素位置

    我正在尝试实现 SIFT 目前只是想在开始在 MATLAB 中实现它之前了解它的工作原理 除了如何使用泰勒展开式计算子像素精度之外 我了解其中的大部分内容 上面是原始论文中的方程 我有几个关于如何应用它的问题 是否分别计算每个维度的导数 然
  • 'str'对象不可调用,如何处理?

    当我运行 Python Django 应用程序时 收到错误 str 对象不可调用 我已经尝试过这里的解决方案 类型错误 str 对象不可调用 Python https stackoverflow com questions 6039605
  • 无论如何返回自定义错误类型的更简单方法::Error?

    我的工作代码按以下方式返回错误 fn foo gt anyhow Result lt gt Err anyhow Error new MyError MyVariant actual 0 expected 1 有没有更简洁的方法来返回实例M
  • 应用程序传输安全详细

    有没有办法让应用程序传输安全性更加详细 当我的应用程序进行 http 调用时 我将在 Xcode 控制台中收到通知 但是它并没有告诉我哪个 http 请求正在触发应用程序传输安全警告 有没有办法让警告更加详细 使其包含触发警告的 URL 您
  • 更改 *splat 和 **splatty-splat 运算符对我的对象执行的操作

    如何覆盖解包语法的结果 obj and obj 例如 你能以某种方式创建一个对象吗thing其行为如下 gt gt gt thing a b c gt gt gt x for x in thing d e f gt gt gt thing
  • 使用 String#sum 的 Ruby Anagram

    我已经解决了一个问题 要求您编写一个方法来确定所提供的数组中的哪些单词是字谜词 并将字谜词分组到输出中的子数组中 我已经使用似乎是典型的方式解决了这个问题 即对单词进行排序并根据其排序的字符将它们分组为散列 当我最初开始寻找一种方法来做到这
  • GET /socket.io/?EIO=3&transport=polling&t=MniHjPM HTTP/1.1

    我有一个简单的 Flask 聊天应用程序 我正在从教程中测试它 据说我只需要使用 python app py 命令运行它 但是当我通过访问它时http 本地主机 5000 http localhost 5000我不断收到这样的消息 我希望能
  • 使用asp.net MVC4,如何使我的根index.html默认执行?

    对于我网站的大部分内容 我希望以 MVC 方式进行正常路由 但是 当应用程序首次启动时 我不希望路由转到 Home Index cshtml 我希望它简单地转到 Index html 我当前的 RegisterRoutes 看起来像这样 并
  • 无法在 SAMSUNG GALAXY S7 EDGE 上调试

    为什么我无法在 RAD STUDIO 10 Seattle upd 1 中的 SAMSUNG GALAXY S7 EDGE ANDROID 6 0 1 上调试我的应用程序 当我调试时 设备上的应用程序启动 但 RAD STUDIO Delp
  • 如何创建类属性? [复制]

    这个问题在这里已经有答案了 在 python 中 我可以使用以下方法向类添加方法 classmethod装饰师 是否有类似的装饰器可以向类添加属性 我可以更好地展示我在说什么 class Example object the I 10 de