V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
soratadori
V2EX  ›  Python

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

  •  
  •   soratadori · 2016-05-12 03:53:16 +08:00 · 2778 次点击
    这是一个创建于 2924 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    代码:

    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 下会显得很难看,所以暂时不考虑此方法。

    8 条回复    2016-05-12 14:59:21 +08:00
    binux
        1
    binux  
       2016-05-12 03:56:30 +08:00
    class B(A)
    Aether
        2
    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
        3
    soratadori  
    OP
       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
        4
    soratadori  
    OP
       2016-05-12 04:24:42 +08:00
    我也不清楚一个类里的操作像这样稍微复杂一点(管到外面)是不是很不好,还是只管自己就行。
    我想这么做是因为除了 class B 还有 class C D E F G ,这些稍微复杂一点的操作如果全部写在 class A 下面的话,会显得比较散乱
    oott123
        5
    oott123  
       2016-05-12 06:37:07 +08:00 via Android
    把 a 存在 B 的实例变量里( b.x = new A()),然后用 self.x.y 去调用。
    msg7086
        6
    msg7086  
       2016-05-12 06:47:07 +08:00
    你这个应该属于变量绑定的范畴吧……
    要么把变量注入目标对象里,要么用全局变量咯。
    jixiangqd
        7
    jixiangqd  
       2016-05-12 10:25:11 +08:00
    你是要干什么?觉得这并不是良好的实践,相当于写死了代码,而且安全性不高。
    建议组合使用策略模式 + 工厂 or 抽象工厂,进行对象绑定,然后通过 self 访问被绑定对象。
    Aether
        8
    Aether  
       2016-05-12 14:59:21 +08:00
    @soratadori 你还是没说你要干嘛……抽烟未必都要用打火机来点燃,火柴其实也可以的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6425 人在线   最高记录 6547   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:45 · PVG 09:45 · LAX 18:45 · JFK 21:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.