在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中的文本。这太过分了,因为您可以只用几行代码就可以完成相同的操作,但是
您可配置在加班时间内从公司回家、从家去公司的车费进行企业支付。 设置步骤 管理员登陆滴滴企业版用车管理后台,点击左侧边栏“用车制度”选项,点击“新建用车制度”,选择“加班”。填写规则如下:•用车时段:即加班时间 •用车方式:可根据公司政策配置员工可用方式 •办公地点:可配置多个公司地址 •同城限制:员工下单不允许跨城,如:从深圳办公区到东莞火车站 •可用日期 ①可配置在特定日期内可用 ②不限制则为