大家写 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)
7341 次点击
所在节点    Python
50 条回复
congeec
2016-05-23 17:54:56 +08:00
写起来并不繁琐,你需要 vim
cxh116
2016-05-23 17:57:38 +08:00
有比较好一点,在 ruby 里面这是一个比较容易踩的坑.

puts name,这个 name 变量,如果没有,则从自动从 self 对象上面找.
习惯后,就有可能 name = 'test' 这样写,但这样赋值,变成给 name 本地变量赋值,而不是实例属性赋值,有点坑.
a412739861
2016-05-23 18:19:37 +08:00
@aaaron7 Objective-C 的风格么,不过我感觉驼峰的写法不容易读……还是下划线的好读。当然 Apple 里面都是驼峰,自然为了一致,都写驼峰了。
introom
2016-05-23 18:22:01 +08:00
self 是很冗余,一个语言不是什么都好可惜现在回不去了,不可能说我们把 self 作为一个关键字。
ayaseangle
2016-05-23 18:40:02 +08:00
主要是 python 的 oo 特性是随着后期发展慢慢加进去的,所以看上去不是那么和谐。。。
Mutoo
2016-05-23 18:51:12 +08:00
python 语言在发明的时候就规定一件事只有一种做法( There's Only One Way To Do It )。像 java 那样,省略或不省略 this 两种写法就违背了这个守则,详见:
https://wiki.python.org/moin/TOOWTDI
eric6356
2016-05-23 19:16:03 +08:00
Explicit is better than implicit.
https://www.python.org/dev/peps/pep-0020/
relic
2016-05-23 20:02:30 +08:00
php 的 this 和 self 岂不美哉?
SlipStupig
2016-05-23 20:24:58 +08:00
@scriptfans 用 this 或者用声明 thiscall 修饰,在虚拟机里面采用调用方来维持堆栈平衡, python 设置的时候就没想过用程序员来平衡虚拟机堆栈
tempdban
2016-05-23 20:47:30 +08:00
我还觉得$贼傻逼呢,该用不还是得用
weyou
2016-05-23 23:21:07 +08:00
加上 self 更加清晰, C++里面不需要 this ,往往要用别的方式来表明这是个类成员变量,比如加上 m_前缀。
incompatible
2016-05-23 23:24:21 +08:00
@Mutoo 你说的并不能解答楼主的问题,楼主问的是 self 是否冗余。假设 Java 显示规定必须使用或必须不使用 this.来调用成员方法或引用成员变量,看起来显然比 python 清爽多了。
msg7086
2016-05-23 23:48:45 +08:00
觉得繁琐写 Ruby 去啊。
Python 的精髓就是繁琐……
zijikai
2016-05-24 00:29:43 +08:00
对于新手来说,至少逻辑上理解起来轻松多了。
noli
2016-05-24 01:55:15 +08:00
在 python 中 self 是必须的,否则二义性会毁掉这门语言。我很奇怪居然有人说 self 是冗余的?
SharkIng
2016-05-24 02:01:22 +08:00
self 主要是方便日后使用 class 里面的变量 感觉有点像 java 里面的 public 变量
markx
2016-05-24 02:06:37 +08:00
@ma125125t 看到类名是 VendingMachine , 你就该知道这个跟股票没关系了。
ligyxy
2016-05-24 04:43:57 +08:00
居然不止一个人说变量名不明确,心疼楼主
jamiesun
2016-05-24 07:01:50 +08:00
self,这是一个必须的东西,也是 python 严谨性的一个体现
jamiesun
2016-05-24 07:04:25 +08:00
不喜欢 self ,你可以用 this 啊

class A:
...: def __init__(this):
...: print this.__class__

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

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

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

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

© 2021 V2EX