当前位置: 首页 > 面试题库 >

如何制作班级财产?

司马彬
2023-03-14
问题内容

在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)

现在一切都会好起来的。



 类似资料:
  • 问题内容: 我目前正在将H2O用于分类问题数据集。我正在python 3.6环境中对其进行测试。我注意到预测方法的结果是给出0到1之间的值(我假设这是概率)。 在我的数据集中,目标属性是数字,即值是1且值是0。我确保将类型转换为目标属性的类别,但仍得到相同的结果。 然后我修改了代码,仍然使用H2OFrame上的方法将目标列转换为因数,结果没有任何变化。 但是,当我分别将target属性中的值分别更

  • 问题内容: 我正在使用Java版本的Google App Engine。 我想创建一个可以接收许多类型的对象作为参数的函数。我想打印出对象的成员变量。每个对象可能不同,并且该功能必须适用于所有对象。我必须使用反射吗?如果是这样,我需要编写哪种代码? 我将如何编写函数getObject? 问题答案: 是的,您确实需要反思。它会像这样: 有关更多信息,请参见反射教程。

  • 问题内容: 如果我将Class声明为字段: Eclipse给我警告: 类是原始类型。对泛型类型Class的引用应参数化 在实践中这意味着什么?我为什么要这样做呢?如果我要求Eclipse提供“快速修复”,它将给我: 这似乎并没有增加太多价值,但不再发出警告。 编辑:为什么类通用?您能否举一个参数化的例子,即可以有效使用除以外的东西吗? 编辑:哇!我还没有意识到这一点。我也看过Java拼图游戏,这肯

  • 问题内容: 如何选择类似的课程? 我已经试过了: 问题答案: 正如Zepplock所说,实际上是单个属性中的两个类:和。该空格不是类名的一部分;它充当分隔符。 这三个选择器都将与之匹配: 最后一个选择器仅拾取该元素,因为它同时具有 两个 类。 你 从来没有 链接类选择的时候,甚至没有像这样包括空间: 这样可以选择包含在单独元素中的元素。

  • 问题内容: 我只想了解秋千的一些知识1)如何在秋千中使用MVC模型?2)说我有一个主窗口,我需要将菜单作为单独的类,将所有组件作为单独的类,这将是集成它的最佳方法 问题答案: 好的,这被称为过度矫正地回答,对此感到抱歉,但这是我快速举过的一个简单示例,尝试使用简单的MVC模式完成一些琐碎的事情:按下按钮并更改JTextField中的文本。这太过分了,因为您可以只用几行代码就可以完成相同的操作,但是

  • 您可配置在加班时间内从公司回家、从家去公司的车费进行企业支付。 设置步骤 管理员登陆滴滴企业版用车管理后台,点击左侧边栏“用车制度”选项,点击“新建用车制度”,选择“加班”。填写规则如下:•用车时段:即加班时间 •用车方式:可根据公司政策配置员工可用方式 •办公地点:可配置多个公司地址 •同城限制:员工下单不允许跨城,如:从深圳办公区到东莞火车站 •可用日期 ①可配置在特定日期内可用 ②不限制则为