Python中的self

如果写得是静态方法就不写self。

class A:
    @staticmethod
    def test():
        print 'hello'

 2010-6-25  15:17:56  我  谁说说python中的this和self的解释? 
2010-6-25  15:18:18  同学A  python里面既没有this也没有self
2010-6-25  15:19:45  我  怎么会没有self? class Person: def sayHi(self): .... 
2010-6-25  15:20:08  同学A  路云是个明白人
2010-6-25  15:20:23  同学A  self不是python的关键字,这里sayHi函数的第一个参数你写成slef也不会出错
2010-6-25  15:21:19  我  倒是没看到this,一直以为self就象JAVA中的this,但前面查资料时,发现python还有this,就有点糊涂了 
2010-6-25  15:21:44  同学A  http://z.xiaoi.com/r?docs.python.org%2Ffaq%2Fprogramming%23what-is-self
2010-6-25  15:21:58  同学A  对,你可以叫做yours
2010-6-25  15:22:08  同学A  不一定叫做self
2010-6-25  15:22:15  同学A  只是一个形参而已
2010-6-25  15:22:27  我  那self的用法是怎么讲的?
2010-6-25  15:23:03  我  是不是self就可以把他看作一个"自己"的变量名
2010-6-25  15:23:50  同学A  就是一个参数,因为对象调用方法是必然出入一个位置首位的参数
2010-6-25  15:23:54  同学A  python在调用对象的方法的时候默认会把对象本身当做第一个参数传给方法
2010-6-25  15:24:18  同学A  所以需要一个参数放在方法定义的第一个位置上
2010-6-25  15:24:57  同学A  关于这第一个参数的名称大家达成了默契,都叫“self”
2010-6-25  15:25:03  同学A  在这方面跟普通的函数调用没有区别
2010-6-25  15:25:56  我  那是不是类的所有方法都要必须加上(self,*)这样?以便实例调用这个方法?
2010-6-25  15:26:14  同学A  对
2010-6-25  15:26:24  同学A  静态的方法可以免掉
2010-6-25  15:26:38  同学A  嗯,除了staticmethod和classmethod
2010-6-25  15:26:59  我  恩,这个知道:)
2010-6-25  15:27:21  我  那python有没有this?他和这个self怎么区别?
2010-6-25  15:27:53  同学A  python没有严格的对象概念,故……
2010-6-25  15:28:03  同学A  this可以免掉

《简明python教程》对self的用法介绍如下:

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self
虽然你可以给这个参数任何名称,但是 强烈建议 你使用self这个名称——其他名称都是不赞成你使用的。使用一个标准的名称有很多优点——你的程序读者可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。
=======================================================
给C++/Java/C#程序员的注释
Python中的self
等价于C++中的self指针和Java、C#中的this参考。
=======================================================
你一定很奇怪Python如何给self赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self的原理了。
这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。
我这里补充一下几个实例程序以加深理解:
class Person:
def sayHi(self):
  print 'Hello,how are you?'
p=Person()
p.sayHi()
结果显示为:
Hello,how are you?
改一下:
class Person:
def sayHi(self):
  print 'Hello,how are you?'
p=Person()
Person.sayHi(p)
结是同上!
再改一下:(去掉self,会怎么样呢?)
class Person:
def sayHi():
  print 'Hello,how are you?'
p=Person()
Person.sayHi(p)
p.sayHi()
出现如下错误信息:
Traceback (most recent call last):
  File "C:\pro\Person2.py", line 5, in ?
    Person.sayHi(p)
TypeError: sayHi() takes no arguments (1 given)

 

self是一种习惯的用法,你完全可以写成this或obj之类的东西,但使用self是一种约定俗成的东西。每一个类的方法,第一个参数都必须是self参数。在调用时,self将为类的实例。如:
    class   a:
          def   p(self,   a,   b):
                print   a,   b  
b=a()
b.p( '1 ',   '2 ')

这里调用p时,self参数不用写出来,但它实际上就是实例b。也就是说第一个参数在调用是不用写,但这个方法前一定要有实例的限定,如b.之类的东西。

 

self不是类本身,而是实例本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值