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
chaleaoch
V2EX  ›  Python

关于面相对象编程的一个问题:返回值和属性的设置

  •  
  •   chaleaoch · 2016-11-23 19:51:36 +08:00 · 2129 次点击
    这是一个创建于 2951 天前的主题,其中的信息可能已经有所发展或是发生改变。
    楼主编程经验有限,代码量也有限。今天在敲代码的时候发现了一个问题:
    self.<属性>可以跨方法访问,那么它既可以用来代替参数,也可以用来代替返回值。

    我的问题是,那种情况下用参数,那种情况下需要返回,那种情况下需要用 self.<属性>?

    谢谢。
    第 1 条附言  ·  2016-11-23 20:44:57 +08:00
    class ClassDemo(object):
    def method_a1(self):
    return self.argu + 1

    def method_a2(self):
    self.ret_data = self.argu + 1

    def method_a3(self,input_argument):
    return input_argument + 1

    def method_b1(self):
    self.argu = 1
    ret_data = self.method_a1()
    print ret_data

    def method_b2(self):
    self.method_a2()
    print self.ret_data

    def method_b3(self):
    print self.method_a3(1)

    instance_demo = ClassDemo()
    instance_demo.method_b1()
    instance_demo.method_b2()
    instance_demo.method_b3()

    大概就是这个意思吧。。。
    b1,b2,b3 都能得到相同的结果。但是参数和返回值的方式都不同。那么哪种情况下用那个方法呢。
    20 条回复    2016-11-24 10:14:21 +08:00
    shyling
        1
    shyling  
       2016-11-23 20:10:04 +08:00 via iPhone   ❤️ 1
    没看懂你在说什么
    AutoRip
        2
    AutoRip  
       2016-11-23 20:19:16 +08:00 via Android   ❤️ 1
    @shyling 突然觉得应该先给楼主推荐《 Effective C++》……
    chaleaoch
        3
    chaleaoch  
    OP
       2016-11-23 20:23:51 +08:00
    @AutoRip 哈哈哈哈 来不及了。只敲过 python 。不吝赐教啊。。。很诚恳的说。
    Ouyangan
        4
    Ouyangan  
       2016-11-23 20:29:06 +08:00   ❤️ 1
    我也没懂楼主在说什么
    fyl00
        5
    fyl00  
       2016-11-23 20:31:47 +08:00   ❤️ 1
    哈哈哈哈,果然只有新手能看懂新手的疑惑啊。我最近写工具的时候也有这个疑惑。

    class A():
    jimzhong
        6
    jimzhong  
       2016-11-23 20:37:08 +08:00   ❤️ 1
    不要使用 self.<属性>用来传递临时的参数,除非参数是这个对象的属性。
    我已经不懂我在说什么了
    Guaidaodl
        7
    Guaidaodl  
       2016-11-23 20:38:38 +08:00   ❤️ 1
    最好使用返回值和参数,尽量不要让函数运行结果依赖于外部状态。
    uuuing
        8
    uuuing  
       2016-11-23 20:42:11 +08:00   ❤️ 1
    没太懂。。。
    chaleaoch
        9
    chaleaoch  
    OP
       2016-11-23 20:45:41 +08:00
    @jimzhong 那么请问,对象的属性是用来做什么的?
    mandex
        10
    mandex  
       2016-11-23 20:47:17 +08:00   ❤️ 1
    然而我并没有写过 python 。

    我的看法是,公用的方法也就是要对外暴露的方法肯定是用参数和返回值的。

    私有的方法之间可以互相用类属性,私有方法最终是为公有的方法服务的。
    cuebyte
        11
    cuebyte  
       2016-11-23 20:50:02 +08:00   ❤️ 1
    你说的跨方法访问,不过是一个类里的不同方法都能访问到类里的属性罢了。

    凡是临时的可有可无的变量,都不要设置成类属性,用普通变量就好了。如果你学的是 java ,用 getter/setter 就不会想出这样的问题了。

    你也可以了解一下函数式编程里的函数是怎么用的,就会对 function/method 有个比较清楚的认识了。

    我也不知道自己在说什么了……
    chaleaoch
        12
    chaleaoch  
    OP
       2016-11-23 20:50:54 +08:00
    @mandex 那么我们举私有方法的例子,
    像我之前用函数的方式做,跳进一个函数里面第一眼看参数,第二眼看返回值,这样就能基本确定这个函数的输入和输出是什么,阅读效率很高(目的性强)。
    但是今天封了一个对象出来。各个私有方法之间用私有属性传递。功能实现了,。但是看着怪怪的。随着项目变大代码量增长岂不是阅读起来要乱套?

    请指点。多谢啦!
    chaleaoch
        13
    chaleaoch  
    OP
       2016-11-23 20:54:28 +08:00
    @cuebyte
    我今天遇到的情况,用对象的属性来做确实方便。。。只是写完之后发现,如果过段时间再看,或者别人来看我写的东西,会觉得怪怪的,不知道是我看代码的方式怪还是我写的怪。

    所以发出来想和前辈们请教下。

    至于您说的函数式编程和 java 。。。
    chaleaoch
        14
    chaleaoch  
    OP
       2016-11-23 21:01:48 +08:00
    @fyl00 然而现在得到结论了没? :)
    mandex
        15
    mandex  
       2016-11-23 21:01:51 +08:00   ❤️ 1
    @chaleaoch 属性是描述对象特征的,他可以让各个方法共享数据,但他不是为了传递数据设计的。我觉得,如果一个属性和对象没有逻辑上的包含从属关系,就不适合写成属性。
    chaleaoch
        16
    chaleaoch  
    OP
       2016-11-23 21:04:02 +08:00
    @mandex 我明天在去瞅瞅我的代码然后在向您请教。
    vwok
        17
    vwok  
       2016-11-23 21:18:57 +08:00   ❤️ 1
    要按照具体使用场景要看,可以想成一个银行账号,属性值表示余额
    a1 方法就是看一下存进去一块钱之后,余额是多少
    a2 方法就是真的存进去一块钱,做了这个操作
    a3 就相当于是个计算器,算一下假如某个人有多少钱,加一块钱之后是多少
    chaleaoch
        18
    chaleaoch  
    OP
       2016-11-23 21:29:00 +08:00
    @vwok 我有一个小问题。
    您说的真的存进去一块钱( a2 )是不是应该是这样的:
    def method_a2(self):
    self.argu += 1
    vwok
        19
    vwok  
       2016-11-23 21:31:42 +08:00   ❤️ 1
    @chaleaoch 对,是应该这样
    fyl00
        20
    fyl00  
       2016-11-24 10:14:21 +08:00
    @chaleaoch 没有,自己看怎么方便怎么来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5421 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 07:31 · PVG 15:31 · LAX 23:31 · JFK 02:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.