是否可以指定在非冻结数据类中冻结单个字段?像这样的东西:
@dataclass
class Data:
fixed: int = field(frozen=True)
mutable: int = field(frozen=False)
d = Data(2, 3)
d.mutable = 5 # fine
d.fixed = 7 # raises exception
Run Code Online (Sandbox Code Playgroud)
我意识到这可以通过访问私有数据字段的属性和设置器手动完成,但是这样我们就失去了数据类的一些优点:首先,私有数据字段需要不同的名称,这意味着自动生成的构造函数令人烦恼地具有不同的名称参数名称比字段更重要。
我编写了一个以两个对象作为参数的Nim过程var。它们每个都是一个带有int字段的对象level。在执行程序的实际工作之前,我想将参数按具有较大 的顺序排列level,因此我这样做:
proc subroutine(param1: var MyObject, param2: var MyObject) =
var large: ptr MyObject = param1.addr
var small: ptr MyObject = param2.addr
# If in wrong order by level, swap large and small
if large.level < small.level:
large = param2.addr
small = param1.addr
# The rest of the proc references, only variables large and small, e.g.,
large.level += 1
small.level += 2
Run Code Online (Sandbox Code Playgroud)
这似乎适用于我的应用程序,但我注意到在Nim 文档中,该ptr类型称为“不安全”,建议仅用于低级操作。有一个“安全”的引用类型ref, …
以下代码创建一个Obj带有 int 字段n(默认值为 0)的数据类。
from dataclasses import dataclass, field
@dataclass
class Obj:
n: int = field(default_factory=int)
a = Obj()
print(a.n)
Run Code Online (Sandbox Code Playgroud)
a.n = 0
Run Code Online (Sandbox Code Playgroud)
现在,添加一个显式__init__构造函数:
a.n = 0
Run Code Online (Sandbox Code Playgroud)
它现在生成此错误,声称该Obj对象没有名为 的属性n:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Input In [6], in <module>
8 pass
10 a = Obj()
---> 11 print(f'a.n = {a.n}')
AttributeError: 'Obj' object has no attribute 'n'
Run Code Online (Sandbox Code Playgroud)
我想也许显式__init__会覆盖field()正在执行的任何操作,但是如果我们从参数更改default_factory为default,它会再次起作用:
@dataclass
class …Run Code Online (Sandbox Code Playgroud) 我有一个带有许多子组件的 React 父组件(成千上万的 SVG 元素重新渲染起来很昂贵)。子组件基于全局状态显示信息;某处是应该以特殊方式显示的那些子组件的列表。由于其他地方需要此列表,因此它不能是每个孩子的本地状态信息,因为它不是孩子的私有信息。
按照这里的建议:https : //reactjs.org/docs/lifting-state-up.html我将状态提升到父组件。然而,一次只有一个孩子会改变;例如,用户可能会单击一个 SVG 元素来调整其显示属性(这些属性存储为孩子的道具)。但是,由于状态存储在父组件中,因此调用setState父组件会触发整个父组件(包括其所有数千个子组件)的昂贵重新渲染,即使它们中的大多数没有更改。
所以我不确定如何在 React 中正确地做到这一点并获得良好的性能。(我找到了这个forceUpdate方法,还有很多警告永远不要使用它。)我想我想做的是以某种方式更新孩子的道具,但从文档中,我可以看到父母的唯一方法更新单个孩子的道具,是为了render()调用父级的方法,这意味着它也在重新渲染所有没有改变的兄弟姐妹,这是我想要避免的昂贵情况。
有没有办法让存储在父级或其他地方的点击处理程序可以访问全局状态,来改变这个状态,并更新它影响的单个子组件的道具,然后只告诉那个子组件重新 -使成为?
抱歉,我没有包含任何源代码;这实际上是用 Dart 编写的,而不是 JS,但我认为问题出在底层 React 库的级别。