|
|
1
274
我想我应该扩大这个答案,因为我已经长大了,更聪明了,知道发生了什么事。迟到总比不迟到好。 你 可以 动态向类添加属性。但这就是关键:你必须把它添加到 班 .
一
当我要求
描述符实际上是Python公开其整个OO实现的管道的方法。实际上,还有另一种类型的描述符比
谦虚的方法只是另一种描述符。它的
不管怎样,我怀疑这就是为什么描述符只在类上工作的原因:它们首先是为类提供动力的东西的形式化。它们甚至是规则的例外:显然可以将描述符分配给类,而类本身就是
我认为,几乎所有Python的OO系统都可以用Python表示,这很酷。:) 哦,我写了一篇 wordy blog post about descriptors 如果你感兴趣的话。 |
|
|
2
51
所以你想要的是一本字典,你可以把a['b']拼成a.b? 这很容易:
|
|
|
3
33
似乎你可以更简单地用
如果您绝对需要编写自己的setter,则必须在类级别上执行元编程;
|
|
4
28
你不需要使用一个属性。只是超越
Tada。
|
|
|
5
5
我问了一个类似的问题 on this Stack Overflow post 创建创建简单类型的类工厂。结果是 this answer 它有一个类工厂的工作版本。 下面是一小段答案:
您可以使用这个变量来创建默认值,这是您的目标(这个问题中还有一个解决这个问题的答案)。 |
|
6
5
假设您有一个要向其添加属性的对象。通常,我希望在需要开始管理对具有下游用法的代码中的属性的访问时使用属性,以便维护一致的API。现在,我通常会将它们添加到定义对象的源代码中,但假设您没有该访问权限,或者您需要真正以编程方式动态地选择函数。 创建一个类
使用基于
documentation for
在Python中,我们希望有一种明显的方式来做事情。但是,在本例中,我将展示两种方法:使用decorator符号,不使用decorator符号。首先,没有装饰符号。这对于getter、setter或deleter的动态分配可能更有用。 动态(即猴子修补)让我们为我们的班级创建一些:
现在我们把这些转让给地产。注意,我们可以在这里以编程方式选择函数,回答动态问题:
用途:
装饰者我们可以像上面用decorator符号所做的那样,但是在本例中,我们 必须 将方法命名为所有相同的名称(我建议将其保持与属性相同),因此编程分配不像使用上述方法那样简单:
并将属性对象及其设置的setter和deleter分配给类:
用途:
|
|
7
5
不能添加新的
|
|
|
8
3
不确定我是否完全理解这个问题,但是您可以在运行时使用内置的
|
|
|
9
3
对于那些来自搜索引擎的人,这是我在谈论的两件事 动态 性能:
如果只需要一个动态属性,请查看 property() 内置功能。 |
|
|
10
2
最好的方法是通过定义
那张照片
这样就可以:
|
|
|
11
2
又一个如何达到预期效果的例子
现在我们可以做如下的事情:
|
|
|
12
0
这似乎可行(但见下文):
如果您需要更复杂的行为,请随意编辑您的答案。 编辑对于大型数据集,以下内容可能更节省内存:
|
|
13
0
要回答问题的主要内容,您需要将dict中的只读属性作为不可变的数据源:
我将演示如何使用
收益率
|
|
|
14
0
输出为:
|
|
|
15
0
可以使用以下代码使用Dictionary对象更新类属性:
|
|
|
16
0
从 kjfletch
输出:
|
|
|
17
0
虽然有很多答案,但我找不到一个我满意的答案。我找到了自己的解决方案
|
|
|
18
-1
动态附加属性的唯一方法是使用新属性创建一个新类及其实例。
|
|
|
19
-1
我最近遇到了一个类似的问题,我想出的解决方案
|
|
|
20
-3
许多提供的答案要求每个属性有如此多的行,即/和/或-我会认为一个丑陋或冗长的实现,因为多个属性需要重复性,等等。我更喜欢将事物煮沸/简化,直到它们不能再简化,或者直到它不起多大作用为止。 简而言之:在已完成的工作中,如果我重复两行代码,我通常会将其转换为单行助手函数,等等…我简化了数学或奇数参数,例如(start_x,start_y,end_x,end_y)到(x,y,w,h)ie x,y,x+w,y+h(有时需要min/max,或者如果w/h为负数,而实现不喜欢它,我将从x/y和abs w/h中减去。). 重写内部getter/setter是一个不错的方法,但问题是您需要为每个类都这样做,或者将类作为父类设置为该基…这对我不起作用,因为我更愿意自由地选择继承的子/父节点、子节点等。 我已经创建了一个解决方案,它在回答问题时不使用dict数据类型来提供数据,因为我发现输入数据很繁琐,等等…… 我的解决方案要求您在类的上方添加2行,为要添加属性的类创建一个基类,然后为每个类添加1行,您可以选择添加回调来控制数据,在数据更改时通知您,限制可以根据值和/或数据类型设置的数据,等等。 您还可以选择使用_object.x、_object.x=value、_object.getx()、_object.setx(value),它们的处理方式相同。 此外,这些值是唯一分配给类实例的非静态数据,但实际属性被分配给类,这意味着您不想重复、不需要重复的内容…您可以分配一个默认值,这样getter就不需要每次都分配它,尽管有一个选项可以覆盖默认值,还有一个选项可以通过覆盖默认值来返回原始存储值(注意:此方法意味着只有在分配了一个值时才分配原始值,否则它是无的-when重置该值,然后不分配任何值等。) 也有许多助手函数-第一个被添加的属性向类中添加了2个左右的助手以引用实例值…它们是resetaccorpores(_key,..)varargs repeated(所有变量都可以使用第一个命名的args重复)和setaccessors(_key,_value),可以选择将更多的变量添加到主类中以帮助提高效率-计划的方法是:将访问器分组在一起的一种方法,因此,如果您倾向于一次重置几个访问器,则每次都可以将它们分配到一个组并重置该组,而不是f每次重复已命名的键,等等。 实例/原始存储值存储在 班级。 第二类。引用为属性保存静态变量/值/函数的访问器类。级。是在设置/获取等过程中通过实例类访问时调用的属性本身。 访问器类指向类,但由于它是内部的,所以需要在类中分配,这就是为什么我选择使用u name=accessorFunc(…)要分配它,每个属性一行,有许多可选参数可供使用(使用键控varargs是因为它们更容易、更高效地识别和维护)。 如前所述,我还创建了许多函数,其中一些函数使用 访问器函数信息,因此不需要调用它(因为现在有点不方便-现在您需要使用_类)。 .functionname(_class_instance,args)-我使用堆栈/跟踪来获取实例引用以获取值,方法是添加运行此位马拉松的函数,或者向对象添加访问器并使用self(命名此函数以指出它们是针对实例的,并保留对self的访问权),accessorfunc类将引用以及函数定义中的其他信息)。 还没有完全完成,但这是一个非常好的立足点。注意:如果不使用u name=accessorFunc(…)要创建属性,即使我在init函数中定义了该键,您也无法访问它。如果你这样做了,就没有问题了。 另外:请注意,名称和密钥是不同的…名称是“正式”的,用于创建函数名,密钥用于数据存储和访问。ie _class.x,其中小写x是键,名称将为大写x,因此getx()是函数,而不是getx(),看起来有点奇怪。这允许self.x工作并看起来合适,但也允许getx()和look appropriate。 我有一个示例类,其中的键/名称相同,并且要显示的是不同的。为了输出数据而创建的许多助手函数(注意:并非所有这些都是完整的),这样您就可以看到发生了什么。 当前使用key:x、name:x输出的函数列表为: 这绝不是一个全面的名单-有一些人在发帖的时候还没有写在上面…
正在输出的一些数据是: 这是一个全新的类,使用demo类创建,除了名称(以便输出)之外,没有分配任何数据,它是foo,我使用的变量名…
这是在以相同的顺序分配所有foo属性(名称除外)之后:string,1.0,true,9,10,false
请注意,由于受限制的数据类型或值限制,一些数据没有分配-这是由设计造成的。setter禁止分配错误的数据类型或值,甚至禁止将其指定为默认值(除非重写默认值保护行为) 代码没有发布在这里,因为我在示例和解释之后没有空间…也因为它会改变。 请注意:在这篇文章的时候,文件是混乱的-这将改变。但是,如果您以崇高的文本运行它并编译它,或者从python运行它,它将编译并吐出大量的信息-accessordb部分没有完成(它将用于更新print getter和getkeyoutput helper函数以及更改为一个实例函数,可能放在一个函数中并重命名-look f或者… 下一步:并不是运行它所需要的所有东西——底部的很多注释内容是为了获得更多用于调试的信息——当您下载它时,它可能不在那里。如果是,您应该能够取消注释并重新编译以获取更多信息。 我正在寻找一个需要我的类库的工作:通过,我的类(我的类库):…-如果你知道一个解决方案-发布它。 课堂上唯一需要的就是台词- STR 用于调试 初始化 -它们可以从演示类中删除,但您需要注释掉或删除下面的一些行(foo/2/3)。 上面的string、dict和util类是我的python库的一部分——它们并不完整。我从图书馆里复制了一些我需要的东西,并创造了一些新的东西。完整的代码将链接到完整的库,并包括它,同时提供更新的调用和删除代码(实际上,唯一剩下的代码将是demo类和print语句-accessorFunc系统将移动到库中)。 文件的一部分:
这种美使得使用accessorFuncs/callbacks/data-type/value-enforcement等动态添加属性创建新类变得非常容易。 目前,链接位于(此链接应反映对文档的更改。): https://www.dropbox.com/s/6gzi44i7dh58v61/dynamic_properties_accessorfuncs_and_more.py?dl=0 另外:如果您不使用高级文本,我建议您使用它而不是记事本++、Atom、可视代码和其他,因为正确的线程实现使它使用起来更快、更快……我也在为它开发一个类似于IDE的代码映射系统-看看: https://bitbucket.org/Acecool/acecoolcodemappingsystem/src/master/ (首先在包管理器中添加repo,然后安装plugin-当版本1.0.0准备就绪时,我会将其添加到主插件列表…) 我希望这个解决方案有帮助…而且,一如既往: 仅仅因为它起作用,就不能使它正确-乔希'阿齐科莫瑟 |
|
|
user10685 · 如何修改“pathlib.Path”的行为? 2 年前 |
|
|
PapeK24 · 替换pytest中的关键字参数 8 年前 |
|
|
rigyt · 本地应用Rails核心修复 11 年前 |