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

2016-11-23 19:51:36 +08:00
 chaleaoch
楼主编程经验有限,代码量也有限。今天在敲代码的时候发现了一个问题:
self.<属性>可以跨方法访问,那么它既可以用来代替参数,也可以用来代替返回值。

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

谢谢。
2035 次点击
所在节点    Python
20 条回复
shyling
2016-11-23 20:10:04 +08:00
没看懂你在说什么
AutoRip
2016-11-23 20:19:16 +08:00
@shyling 突然觉得应该先给楼主推荐《 Effective C++》……
chaleaoch
2016-11-23 20:23:51 +08:00
@AutoRip 哈哈哈哈 来不及了。只敲过 python 。不吝赐教啊。。。很诚恳的说。
Ouyangan
2016-11-23 20:29:06 +08:00
我也没懂楼主在说什么
fyl00
2016-11-23 20:31:47 +08:00
哈哈哈哈,果然只有新手能看懂新手的疑惑啊。我最近写工具的时候也有这个疑惑。

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

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

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

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

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

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

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

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

至于您说的函数式编程和 java 。。。
chaleaoch
2016-11-23 21:01:48 +08:00
@fyl00 然而现在得到结论了没? :)
mandex
2016-11-23 21:01:51 +08:00
@chaleaoch 属性是描述对象特征的,他可以让各个方法共享数据,但他不是为了传递数据设计的。我觉得,如果一个属性和对象没有逻辑上的包含从属关系,就不适合写成属性。
chaleaoch
2016-11-23 21:04:02 +08:00
@mandex 我明天在去瞅瞅我的代码然后在向您请教。
vwok
2016-11-23 21:18:57 +08:00
要按照具体使用场景要看,可以想成一个银行账号,属性值表示余额
a1 方法就是看一下存进去一块钱之后,余额是多少
a2 方法就是真的存进去一块钱,做了这个操作
a3 就相当于是个计算器,算一下假如某个人有多少钱,加一块钱之后是多少
chaleaoch
2016-11-23 21:29:00 +08:00
@vwok 我有一个小问题。
您说的真的存进去一块钱( a2 )是不是应该是这样的:
def method_a2(self):
self.argu += 1
vwok
2016-11-23 21:31:42 +08:00
@chaleaoch 对,是应该这样
fyl00
2016-11-24 10:14:21 +08:00
@chaleaoch 没有,自己看怎么方便怎么来

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

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

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

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

© 2021 V2EX