绑定方法和非绑定方法

一:绑定方法

绑定方法有两种,一种是与对象绑定,在类中定义的方法都是都是默认与对象绑定的,另一种是绑定到类的方法,要加上classmethod装饰器:

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        print("我的名字是:{}".format(self.name))

    @classmethod
    def say_hello(cls):
        print('hello!!', cls.__name__)

    @staticmethod
    def info(self, a, b):
        print(self.name, a, b)
演示案例

绑定到对象的方法:

定义:类中定义的方法都默认绑定对象

def get_name(self):
    print("我的名字是:{}".format(self.name))

对象来调用

p1 = People('ls', 19) #实例化出一个对象
p1.get_name() #调用绑定到对象的方法

#运行结果:我的名字是:ls

类来调用

p1 = People('ls', 19)
Pepel.get_name(p1) #需要传入一个参数

#运行结果:我的名字是:ls

其它的类和其实例化对象来调用,都不能调用。这是因为类中定义的方法,其方法名称存在于类的名称空间之中。

绑定到类的方法:

绑定到类的方法的定义:是类中用classmethod装饰的方法

@classmethod
def say_hello(cls):
    print('hello!!', cls.__name__)

对象来调用:

p1 = People('ls', 19)
p1.say_hello()  #对象调用绑定到类的方法

#运行结果:hello!! People

对象调用,会自动把对象的类作为第一个参数自动传入

类来调用:

People.say_hello()

#运行结果:hello!! People

类调用绑定到类的方法,有自动传值的特性,会把类本身作为第一个参数自动传入

二:非绑定方法

非绑定方法是类中用staticmethod装饰的方法,被staticmethod装饰的方法不与任何对象和类绑定。

定义非绑定方法:

@staticmethod
    def info(self, a, b):
        print(self.name, a, b)

对象调用:

p1 = People('ls', 19)
p1.info(p1, 1, 2)

#运行结果:ls 1 2

没有指定自动传值的特性,按照一般函数的参数传入要求传值。

类来调用:

People.info(p1, 2, 3)

#运行结果:ls 2 3

同对象调用要求一致

三:总结

无论是绑定到对象的方法,还是绑定到类的方法,亦或是静态方法,类和类的对象都可以调用,其中:

绑定到对象的方法:

        对象调用有自动传值特性,会把对象本身当做第一个值自动传入;

        类来调用,失去自动传值的特性,必须要传入一个满足条件的实参。

绑定到类的方法:

        类调用有自动传值特性,会把类本身当做第一个值自动传入;

        对象调用会自动把对象的类当做第一个值自动传入。

非绑定方法:

  不与任何绑定,类和类的实例化对象都可以调用,没有自动传值的特性,调用静态方法,就像调用普通函数一样必须传入与形参一一对应的实参。

posted @ 2018-06-07 20:37  Leslie-x  阅读(229)  评论(0编辑  收藏  举报