函数能不能“预知”地访问某个实例?

2016-05-12 03:53:16 +08:00
 soratadori

函数能不能“预知”的访问某个实例?

代码:

class A:
    def __init__(self):
        self.var1 = Str
        self.var2 = []
        self.var3 = {}

class B
    def operate1:
          return a.varX
    def operate2
          return a.varX

a = A()
B.operate1()
B.operate2()

将 A()实例化的变量名 a 是不固定的,可能是 b c d e 。

operate1 、 operate2...operateX 的操作里都包含有 class A 实例化之后才有的变量,如果不能提前知道变量名,这样的操作就无从谈起。有什么办法可以解决吗?试过将 class 嵌套,或者引入父子关系好像都没办法解决。

如果吧 operate1 2 3...写在 class A 之下的话,虽然可以解决问题,但因为某些原因,写在 class A 下会显得很难看,所以暂时不考虑此方法。

2792 次点击
所在节点    Python
8 条回复
binux
2016-05-12 03:56:30 +08:00
class B(A)
Aether
2016-05-12 04:02:21 +08:00
不是很知道你的具体场景……最好先说明你想实现什么场景,再说功能。

也许是这个?

class A(object):
def __init__(self):
self.var1 = Str
self.var2 = []
self.var3 = {}

class B(A)
def operate1:
[self.varX]
def operate2
[self.varX]

a = B()
a.operate1()
a.operate2()

b= B()
b.operate1()
b.operate2()

然而却看不出来这么做有什么意义。
soratadori
2016-05-12 04:20:30 +08:00
对了,补充一点, class B 是包含有初始化步骤的。
class B 不仅存储数据,实例化后的数据会保存到 实例化的 class A 里面。 operate 不仅要对自身操作,还要对 class A 里的数据操作。(例如改一个名字,那也要改 class A 里的索引表)
总的来说 class A 是存储总数据用的。
我也有试过 classs B(A),没记错的话,是访问不到 a.varX 的,不过现在代码不在手边......
@Aether
soratadori
2016-05-12 04:24:42 +08:00
我也不清楚一个类里的操作像这样稍微复杂一点(管到外面)是不是很不好,还是只管自己就行。
我想这么做是因为除了 class B 还有 class C D E F G ,这些稍微复杂一点的操作如果全部写在 class A 下面的话,会显得比较散乱
oott123
2016-05-12 06:37:07 +08:00
把 a 存在 B 的实例变量里( b.x = new A()),然后用 self.x.y 去调用。
msg7086
2016-05-12 06:47:07 +08:00
你这个应该属于变量绑定的范畴吧……
要么把变量注入目标对象里,要么用全局变量咯。
jixiangqd
2016-05-12 10:25:11 +08:00
你是要干什么?觉得这并不是良好的实践,相当于写死了代码,而且安全性不高。
建议组合使用策略模式 + 工厂 or 抽象工厂,进行对象绑定,然后通过 self 访问被绑定对象。
Aether
2016-05-12 14:59:21 +08:00
@soratadori 你还是没说你要干嘛……抽烟未必都要用打火机来点燃,火柴其实也可以的。

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

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

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

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

© 2021 V2EX