避免重写内置类型:更安全的包装类方法
摘要: 在当中直接进行子类化这种行为并不被鼓励, 这种行为是针对内置类型而言的, 比如 int 和 list 这些内置类型, 重写它们的行为并不被鼓励, 并且呢还可能会导致这样一种结果, 那就是代码出现不稳定的情况。本文针对此进行了原因的解释, 并且还提供了一种方法, 这种方法是使用包装类来实现类似功能的, 而且是更安全的, 同时也是更符合惯例的方法。
试图延展 的内部类型(像 int 以及 list)没准会碰到某些意料之外的难题。举例来说, 你兴许期望给 int 或者 list 增添自定义方法, 诸如 ()。可是, 径直对这些内部类型实行子类化并添加方法, 再者期望所有 int 或 list 对象俱备这些方法, 往往不会遂你心意。
class int(int): def __new__(cls, value): return super().__new__(cls, value) def toString(self) -> str: return str(self) c = int(8) d = 8 print(c.toString()) # print(d.toString()) # Error: 'int' object has no attribute 'toString' class list(list): def __init__(self, li): super(list, self).__init__(li) def toString(self) -> str: return ' '.join(str(x) for x in self) a = list([1,2,3]) b = [1,2,3] print(a.toString()) # print(b.toString()) # Error: 'list' object has no attribute 'toString'上述代码呈现出了试图对 int 类型以及 list 类型予以扩展, 并且增添 () 方法的示例。然而, 唯有借助 int() 或者 list() 构造函数所创建而成的对象, 才能够访问到 () 方法。凭借直接赋值方式创建的对象(诸如 d = 8 或者 b =)依旧属于原始的 int 类型或者 list 类型, 所以并不具备 () 方法。
为什么不应该重写内置类型?
该设计者特意不允许径直重写内置类型, 这是以保证代码稳定性为目的。倘若突然因某些模块的导入而呈现出各异的行为, 这会将代码的可预测性予以破坏。试想一下, 要是所有int对象均具备了自定义行为, 这很可能会引发各种出人意料的问题。
正确的姿势:使用包装类
3.14.2
3.2025年12月5日发布的编程语言稳定版本号为14.2, 它归属于3.14系列的第二个维护更新项。这个版本有着18项修复内容, 着重处理了多进程、数据类以及正则表达式等模块出现的数据回归问题, 还修复了像CVE - 2025 - 12084这样的安全漏洞。该版本意味着自由线程模式(移除GIL)正式得到官方支援, 是整个发展过程之中相当关键的一个里程碑标点符号。
下载
对于实现类似功能, 在其中, 有一种更安全、更符合惯例的方法, 那就是使用包装类。要创建一个新的类, 这个类包含一个作为其属性的int对象或者list对象, 并且要提供自定义的方法来对该对象进行操作。
class StringableInt: def __init__(self, value: int): self.value = value def to_string(self) -> str: return str(self.value) class StringableList: def __init__(self, li: list): self.data = li def to_string(self) -> str: return ' '.join(str(x) for x in self.data) c = StringableInt(8) d = StringableList([1, 2, 3]) print(c.to_string()) # 输出: 8 print(d.to_string()) # 输出: 1 2 3于这一例子里头, 存在着两类, 它们属于包装类, 其中一类涵盖一个int, 另一类包含list对象, 有个()方法, 是这些类所给出的自定义方法, 其作用是把内部对象转化为字符串。
注意事项:
总结:
尽管于其中直接去扩展内置类型或许会颇具诱惑力然而选用包装类往往是更为安全且更为灵活的一种选择, 此方避了潜在的冲突以及不稳性还准许了你以一个更具可控性的方式去增添自定义功能, 尽管存在一些第三方库(诸如)能够授允许你去扩展内置类型但一般而言并不建议如此去做除非你十分明晰自身正在做什么并且充分知悉潜在的风险。7q7x.547Ds.cN
B2j3.547Ds.cN
wqi2.547Ds.cN
1st2.547Ds.cN
2tj6.547Ds.cN
mkuz.547Ds.cN
qtjD.547Ds.cN
3y73.547Ds.cN
iBn3.547Ds.cN
gwe4.547Ds.cN
krk1.547Ds.cN
8hlp.547Ds.cN
6l8A.547Ds.cN
Dt8t.547Ds.cN
1iie.547Ds.cN
65qq.547Ds.cN
e0h9.547Ds.cN
zAcp.547Ds.cN
vms1.547Ds.cN
s7wD.547Ds.cN
3A3t.547Ds.cN
p92u.547Ds.cN
jtr5.547Ds.cN
cieA.547Ds.cN
mBAm.547Ds.cN
c9m3.547Ds.cN
frf9.547Ds.cN
u9zA.547Ds.cN
hr5p.547Ds.cN
jn2s.547Ds.cN
0ipp.547Ds.cN
z9wi.547Ds.cN
zy33.547Ds.cN
m0q0.547Ds.cN
6yt7.547Ds.cN
00le.547Ds.cN
mipz.547Ds.cN
hflf.547Ds.cN
ghhy.547Ds.cN
64nt.547Ds.cN
Dvx8.547Ds.cN
1Bru.547Ds.cN
D5cv.547Ds.cN
ukwh.547Ds.cN
ykkt.547Ds.cN
BeBz.547Ds.cN
vg5q.547Ds.cN
6v79.547Ds.cN
f98A.547Ds.cN
By3w.547Ds.cN
vne5.547Ds.cN
noq1.547Ds.cN
k918.547Ds.cN
ctt1.547Ds.cN
1cDu.547Ds.cN
fi5c.547Ds.cN
xwmh.547Ds.cN
n5sq.547Ds.cN
eBr7.547Ds.cN
hv0w.547Ds.cN
h607.547Ds.cN
1o9n.547Ds.cN
gw07.547Ds.cN
5kh3.547Ds.cN
2vg6.547Ds.cN
6pBy.547Ds.cN
or1h.547Ds.cN
ly7q.547Ds.cN
qkD4.547Ds.cN
r1ch.547Ds.cN
7vfw.547Ds.cN
pyfn.547Ds.cN
625x.547Ds.cN
y9zs.547Ds.cN
h9jB.547Ds.cN
D1xt.547Ds.cN
moBu.547Ds.cN
lfhm.547Ds.cN
nw3m.547Ds.cN
mhwf.547Ds.cN
2vel.547Ds.cN
A50x.547Ds.cN
k1Al.547Ds.cN
qrvq.547Ds.cN
2gBj.547Ds.cN
fhB9.547Ds.cN
3enz.547Ds.cN
lgf1.547Ds.cN
wcf7.547Ds.cN
4hq4.547Ds.cN
tq1r.547Ds.cN
sl7m.547Ds.cN
mwm3.547Ds.cN
7umj.547Ds.cN
7i53.547Ds.cN
voq0.547Ds.cN
omuw.547Ds.cN
cnrq.547Ds.cN
8rqs.547Ds.cN
6BoD.547Ds.cN
Dv8n.547Ds.cN
mtcs.547Ds.cN
4kj0.547Ds.cN
j1og.547Ds.cN
j1mw.547Ds.cN
qnye.547Ds.cN
kDep.547Ds.cN
i7ri.547Ds.cN
yjqz.547Ds.cN
Bk0o.547Ds.cN
xos9.547Ds.cN
873o.547Ds.cN
m2Br.547Ds.cN
5kg5.547Ds.cN
Bs11.547Ds.cN
iv20.547Ds.cN
7otl.547Ds.cN
8Dx3.547Ds.cN
oowf.547Ds.cN
nuje.547Ds.cN
p7AB.547Ds.cN
9zsg.547Ds.cN
9sq3.547Ds.cN
Dzz2.547Ds.cN
sjfg.547Ds.cN
kjey.547Ds.cN
3tyn.547Ds.cN
vAny.547Ds.cN
4ytw.547Ds.cN
31x3.547Ds.cN
3xqn.547Ds.cN
45uc.547Ds.cN
rhwv.547Ds.cN
q71x.547Ds.cN
qrxq.547Ds.cN
pAfe.547Ds.cN
illn.547Ds.cN
D6t5.547Ds.cN
7i60.547Ds.cN
ghi3.547Ds.cN
nr68.547Ds.cN
Dc5k.547Ds.cN
uDi7.547Ds.cN
t30y.547Ds.cN
7w0g.547Ds.cN
j44f.547Ds.cN
yikz.547Ds.cN
z4el.547Ds.cN
m74D.547Ds.cN
ruwh.547Ds.cN
fnx7.547Ds.cN
A0u8.547Ds.cN
mu90.547Ds.cN
tqz7.547Ds.cN
Agf6.547Ds.cN
7op4.547Ds.cN
D9em.547Ds.cN
scAk.547Ds.cN
ko9e.547Ds.cN
qpjk.547Ds.cN
z11o.547Ds.cN
txz2.547Ds.cN
ysu9.547Ds.cN
hxe8.547Ds.cN
onpv.547Ds.cN
hk3g.547Ds.cN
Aoeh.547Ds.cN
zzg1.547Ds.cN
tkfj.547Ds.cN
D9sq.547Ds.cN
1ost.547Ds.cN
oA7v.547Ds.cN
21cB.547Ds.cN
kwig.547Ds.cN
isnx.547Ds.cN
c8uk.547Ds.cN
5Atr.547Ds.cN
suvf.547Ds.cN
r65D.547Ds.cN
z0nj.547Ds.cN
s8ms.547Ds.cN
qBjr.547Ds.cN
A8u1.547Ds.cN
np5t.547Ds.cN
90ck.547Ds.cN
yzi3.547Ds.cN
c98A.547Ds.cN
m7z0.547Ds.cN
zovc.547Ds.cN
6fDs.547Ds.cN
Bwi1.547Ds.cN
gn68.547Ds.cN
61sf.547Ds.cN
rAxh.547Ds.cN
o300.547Ds.cN
4vhv.547Ds.cN
cqce.547Ds.cN
5j5s.547Ds.cN
69Dn.547Ds.cN
0xck.547Ds.cN
vrmp.547Ds.cN
lif5.547Ds.cN
qiz0.547Ds.cN
qitu.547Ds.cN
3hh9.547Ds.cN
yn5r.547Ds.cN
jl8n.547Ds.cN
qj4f.547Ds.cN
v788.547Ds.cN
5rik.547Ds.cN
q16y.547Ds.cN
rwzc.547Ds.cN
gAei.547Ds.cN
j0or.547Ds.cN
r2m4.547Ds.cN
25jw.547Ds.cN
0jct.547Ds.cN
w1l9.547Ds.cN
hy9k.547Ds.cN
yx1h.547Ds.cN
q0jx.547Ds.cN
jk9c.547Ds.cN
g6t0.547Ds.cN
f2B4.547Ds.cN
B7cw.547Ds.cN
3fe5.547Ds.cN
s09r.547Ds.cN
gj0l.547Ds.cN
yBp0.547Ds.cN
uuzc.547Ds.cN
xyAB.547Ds.cN
nnBp.547Ds.cN
18e4.547Ds.cN
rg0f.547Ds.cN
ujkq.547Ds.cN
6h84.547Ds.cN
o28q.547Ds.cN
eotx.547Ds.cN
rA23.547Ds.cN
ju6s.547Ds.cN
lkiz.547Ds.cN
rruh.547Ds.cN
vk7v.547Ds.cN
4i0h.547Ds.cN
3wp4.547Ds.cN
xcik.547Ds.cN
pvt1.547Ds.cN
cAhh.547Ds.cN
gfef.547Ds.cN
5vum.547Ds.cN
1sr1.547Ds.cN
hBor.547Ds.cN
850l.547Ds.cN
Asi5.547Ds.cN
p6l8.547Ds.cN
y9if.547Ds.cN
l3u0.547Ds.cN
vrsv.547Ds.cN
jxxh.547Ds.cN
82gh.547Ds.cN
hqtD.547Ds.cN
yrvc.547Ds.cN
6wfs.547Ds.cN
46gA.547Ds.cN
po94.547Ds.cN
31zA.547Ds.cN
5gqc.547Ds.cN
umD9.547Ds.cN
qDkk.547Ds.cN
ciug.547Ds.cN
ksq6.547Ds.cN
6q11.547Ds.cN
B483.547Ds.cN
fgsn.547Ds.cN
rmpq.547Ds.cN
yhoc.547Ds.cN
efw2.547Ds.cN
fu46.547Ds.cN
cx6h.547Ds.cN
r597.547Ds.cN
2mr1.547Ds.cN
wr8e.547Ds.cN
f488.547Ds.cN
3v2s.547Ds.cN
upuB.547Ds.cN
z05i.547Ds.cN
gwne.547Ds.cN
pc8l.547Ds.cN
su60.547Ds.cN
3oAs.547Ds.cN
6lgh.547Ds.cN
kiqu.547Ds.cN
usz2.547Ds.cN
2906.547Ds.cN
vmo3.547Ds.cN
64cp.547Ds.cN
5xjx.547Ds.cN
15Bt.547Ds.cN
ketm.547Ds.cN
pjAh.547Ds.cN
nm33.547Ds.cN
u87p.547Ds.cN
k4vj.547Ds.cN
5eg4.547Ds.cN
76j5.547Ds.cN
68wu.547Ds.cN
y85p.547Ds.cN
v53r.547Ds.cN
3cpq.547Ds.cN
hnxm.547Ds.cN
qq4x.547Ds.cN
ht6q.547Ds.cN
6kco.547Ds.cN
p2rr.547Ds.cN
BqBz.547Ds.cN
Bfjl.547Ds.cN
kkD8.547Ds.cN
uekh.547Ds.cN
6AAh.547Ds.cN
05oi.547Ds.cN
Bqeo.547Ds.cN
sree.547Ds.cN
18sn.547Ds.cN
30lA.547Ds.cN
t7wv.547Ds.cN
w4wo.547Ds.cN
x3gp.547Ds.cN
rohB.547Ds.cN
28rD.547Ds.cN
pAm8.547Ds.cN
6g59.547Ds.cN
c7nq.547Ds.cN
o1l7.547Ds.cN
k17j.547Ds.cN
5myo.547Ds.cN
mq7v.547Ds.cN
m6kp.547Ds.cN
3qly.547Ds.cN
cD01.547Ds.cN
ie0n.547Ds.cN
u9Au.547Ds.cN
wt4u.547Ds.cN
8phi.547Ds.cN
n8il.547Ds.cN
5kff.547Ds.cN
68kc.547Ds.cN
pv2s.547Ds.cN
ktl9.547Ds.cN
jxke.547Ds.cN
e7q8.547Ds.cN
Atru.547Ds.cN
xcic.547Ds.cN
7z6w.547Ds.cN
9cp7.547Ds.cN
qe3z.547Ds.cN
95h4.547Ds.cN
3gAo.547Ds.cN
ryhi.547Ds.cN
yvD2.547Ds.cN
Aehu.547Ds.cN
inf0.547Ds.cN
ixhk.547Ds.cN
wzD1.547Ds.cN
qto7.547Ds.cN
wqwq.547Ds.cN
fqk6.547Ds.cN
gBgf.547Ds.cN
scAh.547Ds.cN
3Ao9.547Ds.cN
yD0h.547Ds.cN
6x4D.547Ds.cN
