class 定义函数问题

class 定义函数问题

如在一个class中定义一个函数要加上(self)

class test:
    def go(self)://如果这里不加self这会出错
        print 'xxx'

a=test()
a.go()//如果上面的go不加 "self"出错

定义个函数
def xx()://这里就可以什么都不加
  print 'sdf'



为什么呢?

1,请保持一下缩进

2,请用 python 的注释风格。怀疑问题是由于LZ没有转过从其他语言转换过来所至……
类的方法要加上self,这是语言的规定啊。
问题是他 go 出错了……不知是怎么搞的……
他说的是不加self,go()才会出错吧……
……


[Copy to clipboard] [ - ]
CODE:
Shell:~/tmp >: ipython
Python 2.5.1 (r251:54863, Jun 15 2008, 18:24:51)
Type "copyright", "credits" or "license" for more information.

IPython 0.8.2 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]: class test:
   ...:     def go(self):
   ...:         print 'go, go'
   ...:         
   ...:         

In [2]: a = test()

In [3]: a.go()
go, go

In [4]:

原因很简单,绑定方法和函数是不同的。

对于函数而言,你已经清楚了;这里我主要讨论方法,类方法和类静态方法--〉仅从语法层面:
1、如果你需要用实例来调用你的方法,那么在定义方法的时候,一定要把第一个参数设置成为self;
2、如果你需要使用静态方法,那么你需要在方法前面加上@staticmethod修饰符;
3、如果要使用类方法,那么你需要在方法前面加上@classmethod修饰符,并且在方法中至少使用一个参数,第一个参数在方法中的作用就是代表改类本身。

如果你想要了解更多的关于方法的一些内幕,推荐你阅读一下官方文档,User-defined methods 。
个人愚见,欢迎斧正!
楼上的能不能把2 3个点代码实例化一下.可能很多人与我一样不是太了解.
class C:
   
    @staticmethod
    def f1(arg): #here is a static method. it's not necessary
                 #to have a arg.
        print 'arg:', arg

    @classmethod
    def f2(cls, arg): #here is a class method. you have to take
                      #at least one arg. you can use another name
                      #to replace the 'cls', but I recommend you
                      #to use cls -- for most python programmer
                      #use it.
        print 'class name:', cls.__name__
        print 'arg:', arg
   
    def f3(self, arg): #here is a instance method. Use 'self' in
                       #python is just as 'this' in C++ or java.
        print 'arg:', arg

    def f4(arg): #no error at here, but when you want to call this
                 #method, there will be an error. see it later.
        print 'error:', arg

def test():# function, not method.
    c = C()
   
    c.f1('cf1') #OK
    C.f1('Cf1') #OK
   
    c.f2('cf2') #OK
    C.f2('Cf2') #OK
   
    c.f3('cf3-1') #OK
    C.f3(c, 'cf3-2') #OK

    #c.f4('cf4') #error
    #C.f4('Cf4') #error

if __name__ == '__main__':
    test()