方法与函数的区别

方法的本质就是函数,只是由于调用者的不同导致传参不同
方法又可区分为绑定方法和非绑定绑定方法
类中没有添加任何装饰器的方法是绑定给对象的方法,
加了classmethod装饰器的方法称为类得到绑定方法,
加了staticmethod装饰器的方法称为非绑定方法

class Foo:
    """这是Foo的doc"""
    def __init__(self, name):
        self.name = name

    def func1(self):
        print("普通方法",self)
    @staticmethod
    def func2():
        print("非绑定方法")
    @classmethod
    def func3(cls):
        print("绑定给类的方法",cls)

a = Foo("summer")
print(a) #<__main__.Foo object at 0x102462c88>  a是foo的一个对象
print(Foo) #<class '__main__.Foo'>
print(a.func1) #<bound method Foo.func1 of <__main__.Foo object at 0x102462c88>>
print(Foo.func1) #<function Foo.func1 at 0x102481b70>
print(a.func2) #<function Foo.func2 at 0x102497048>
print(Foo.func2) #<function Foo.func2 at 0x102497048>
print(a.func3) #<bound method Foo.func3 of <class '__main__.Foo'>>
print(Foo.func3) #<bound method Foo.func3 of <class '__main__.Foo'>>

当由类产生的对象在调用类中的方法的时候,该函数就称为方法,但是由类自己来调用普通的方法的时候,这个方法就是函数,并且内存地址不相同
特殊的是,在函数的上一行添加了一个@staticmethod的装饰器后,它就是一个普通的函数,不用自动传参,不管是由对象还是类来调用,都是调用同一个内存地址
在方法的上一行加上@classmethod装饰器后,对象和类来调用都是方法。

class Foo:
    """这是Foo的doc"""
    def __init__(self, name):
        self.name = name

    def func1(self):
        print("普通方法",self)
    @staticmethod
    def func2():
        print("非绑定方法")
    @classmethod
    def func3(cls):
        print("绑定给类的方法",cls)

a = Foo("summer")
a.func1()
Foo.func1(a)
a.func2()
Foo.func2()
a.func3()
Foo.func3()
普通方法 <__main__.Foo object at 0x101b62cc0>
普通方法 <__main__.Foo object at 0x101b62cc0>
非绑定方法
非绑定方法
绑定给类的方法 <class '__main__.Foo'>
绑定给类的方法 <class '__main__.Foo'>

当对象调用类中的普通方法的时候,不用参数,会将对象本身作为参数传入到self中,但是由类来调用的时候需要传入一个参数

当对象以及类来调用类的绑定方法的时候都不用传入参数

posted on 2018-09-02 10:49  summer-rain  阅读(468)  评论(0编辑  收藏  举报