大家写 python 的时候不会觉得 self 有点冗余吗

2016-05-23 16:21:42 +08:00
 huanghua123

写这样一个简单的类用到 n 多 self ,个人觉得有点冗余,大家什么感觉?我也是初学,或者有好的方法可以避免?

class VendingMachine:
    """A vending machine that vends some product for some price."""
    def __init__(self,stockName,stockPrice):
        self.stockName = stockName
        self.stockPrice = stockPrice
        self.stockNumber = 0
        self.balance = 0

    def vend(self):
        if self.stockNumber == 0:
            return "Machine is out of stock."
        elif self.balance < self.stockPrice:
            return 'You must deposit $' + str(self.stockPrice - self.balance) + ' more.'
        else:
            self.stockNumber -= 1
            change = self.balance - self.stockPrice;
            self.balance = 0
            if change == 0:
                return 'Here is your candy.'
            else:
                return 'Here is your candy and $'+ str(change) +' change.'


    def deposit(self,amount):
        self.balance += amount

        if(self.stockNumber == 0):
            return 'Machine is out of stock. Here is your $' + str(self.balance) + '.'

        return "Current balance: $" + str(self.balance)

    def restock(self,stockNumber):
        self.stockNumber += stockNumber
        return "Current candy stock: " + str(self.stockNumber)
7317 次点击
所在节点    Python
50 条回复
SlipStupig
2016-05-23 16:24:42 +08:00
self 是隐含调用类似 this->obj 这种语法,如果不想用 self 可以声明成静态成员函数,你就不需要写了,同样你无法调用其它非静态成员
BOYPT
2016-05-23 16:27:51 +08:00
要不去学 perl 吧(坏笑
NullMan
2016-05-23 16:34:00 +08:00
建议:
1, 变量采用下划线, 跟 Python 核心类库一致.
2, stockNumber 改为 number_of_stocks. 不看完你代码, 还以为指的的股票代码呢.
3, VendingMachine 改为 AutoStockRobot.
4, balance 存放到你另外一个类(Account).
5, 跟股票相关的, 放到另外一个类, 比如 Stock.
6, AutoStockRobot 就有 account, stocks 这俩主要变量, 和三个那 restock, deposit, vend 这三动作.

总结: 你至少要有三个类, AutoStockRobot, Account, Stock, 单一职责原则. 程序是对现实的模拟, 你现实是怎么样, 程序就能怎么样. 你现实中为人处事很有条理, 规矩, 那么你程序也能写得这么好.
clino
2016-05-23 16:39:07 +08:00
我觉得这是个挺好的做法啊,把面向对象的做法明白展示出来了
其实 lua 也是,不过 lua 可以有语法糖来省掉函数声明里的参数
huanghua123
2016-05-23 16:39:12 +08:00
@BOYPT 其实我也想感受下七周七语言。。
huanghua123
2016-05-23 16:39:41 +08:00
@NullMan 感谢建议
huanghua123
2016-05-23 16:41:01 +08:00
@clino 意思上确实清晰很多。实际上写起来,却有些繁琐。各有取舍吧
NullMan
2016-05-23 16:45:29 +08:00
@huanghua123 No, No, 写起来, 看起来繁琐, 但是你读起来, 维护起来, 轻松得不得了. 不信, 你试试按我的方式写一个, 然后把你我的版本, 给你同事看看. 看看他会觉得哪个最舒服?

如果你程序真的就如上那么简单而且. 那么把这三个类, 写到一个文件里. 那么在编写方面. 只比你的版本繁琐那么一丢丢, 只有一丢丢而已. 但是其他方面, 远远超过你的版本了.

如果是大系统里的一部分, 相信, 拆开来搞.


另外, 你这程序, 看起来是在搞全自动炒股机器人? 可否带带我呀?
huanghua123
2016-05-23 16:50:44 +08:00
@NullMan 我并不是指面向对象繁琐,我是指 self 繁琐,不过也还接受,纯粹吐槽。这其实只是 berkeley 的 homework 。。
NullMan
2016-05-23 16:59:42 +08:00
@huanghua123 坏坏地说一句: 伯克利的学生写的程序这么烂, 让我这一个初中文化的程序员满满的成就感.

逃 :)
aaaron7
2016-05-23 17:09:40 +08:00
我也习惯用类似这样的驼峰命名,被 IDE 各种 warning ……让我改小写。。
huanghua123
2016-05-23 17:10:14 +08:00
@NullMan 。。我不是 berkeley 的。你这么说我就不服了。这明明是个自动售货机,你非要说成炒股机器人...
huanghua123
2016-05-23 17:11:00 +08:00
@aaaron7 肯定是 java 过来的。。
NullMan
2016-05-23 17:13:32 +08:00
@huanghua123 我勒个去, 居然是自动售货机..... 更坏坏说一句: 你这侧面证明了你写得多**, 居然能让我认为是个自动炒股机器人的部件咧....
huanghua123
2016-05-23 17:14:06 +08:00
"""A vending machine that vends some product for some price.""" 你在逗我
NullMan
2016-05-23 17:14:52 +08:00
@huanghua123 哦, 我说写这程序的人.
ma125125t
2016-05-23 17:33:47 +08:00
@NullMan 说的没错,看这变量名取的确实不明所以。 stockName 理解为股票名, stockPrice 理解为股票价格是很正常的了。代码写得好不好,能让别人第一时间上手是很重要的一点。
jiang42
2016-05-23 17:45:44 +08:00
感觉 class 的注释很多余。。。
lightening
2016-05-23 17:50:53 +08:00
你的编辑器会自动帮你写的吧,一般你写 def<tag> 他就出来了。
scriptfans
2016-05-23 17:54:32 +08:00
不加 self 的话,你让解释器如何分辨你是想声明局部变量呢,还是想访问属性?

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

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

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

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

© 2021 V2EX