闲来无聊,用 Python 实现了一个类似指针的东西

2017-06-23 20:44:33 +08:00
 Kilerd

https://gist.github.com/Kilerd/b0f51e66cc1a874fa450ca6cae98bb6b 以上是 GIST 地址

写的原因:

在一个项目里面,我想类里面的两个元素的值永远保持一样

用法大概是这样的:

class A(Alias):

    def __init__(self):
        self.a = 1
        self.alias("b", "a")

a = A()
print(a.a, a.b)

a.a = 2
print(a.a, a.b)

a.b = 3
print(a.a, a.b)

执行结果是:

1 1
2 2
3 3

同时,支持简单的递归用法:

class B:
    a = 1


class C(Alias):

    def __init__(self):
        self.b = B()

        self.alias("a", "b.a")


c = C()
print(c.b.a, c.a)

c.b.a = 2
print(c.b.a, c.a)


c.a = 3
print(c.b.a, c.a)

输出结果

1 1
2 2
3 3

代码没经过认真测试,边缘情况可能会出错,谨慎使用

4555 次点击
所在节点    分享创造
8 条回复
aploium
2017-06-23 22:50:41 +08:00
为什么不用 @property
Kilerd
2017-06-23 23:13:40 +08:00
@aploium 竟无言以对(好像是这么一回事
Kilerd
2017-06-23 23:17:02 +08:00
@aploium 喔,递归进去就不行了,你这个写法。
Kilerd
2017-06-23 23:18:32 +08:00
@aploium https://ooo.0o0.ooo/2017/06/23/594d312c60099.png

这样的话就要每一个 property 都要实现一个 setter
mooncakejs
2017-06-23 23:24:15 +08:00
@Kilerd 也许是 java 的习惯,现在 getter setter 用的很爽
aploium
2017-06-24 11:21:09 +08:00
@Kilerd #3 递归就没办法了,毕竟不是常见的需求
bravecarrot
2017-06-25 00:09:56 +08:00
有点没看懂你的需求?
不就是一个 instance 中有两个属性,不同的名字,指向同一块内存吗,property 正好啊
kevinkim
2017-06-28 16:53:37 +08:00
用户名为"property" 成功被 @,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370674

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX