绑定方法和非绑定方法
一:绑定方法
绑定方法有两种,一种是与对象绑定,在类中定义的方法都是都是默认与对象绑定的,另一种是绑定到类的方法,要加上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
同对象调用要求一致
三:总结
无论是绑定到对象的方法,还是绑定到类的方法,亦或是静态方法,类和类的对象都可以调用,其中:
绑定到对象的方法:
对象调用有自动传值特性,会把对象本身当做第一个值自动传入;
类来调用,失去自动传值的特性,必须要传入一个满足条件的实参。
绑定到类的方法:
类调用有自动传值特性,会把类本身当做第一个值自动传入;
对象调用会自动把对象的类当做第一个值自动传入。
非绑定方法:
不与任何绑定,类和类的实例化对象都可以调用,没有自动传值的特性,调用静态方法,就像调用普通函数一样必须传入与形参一一对应的实参。
Ideal are like the stars --- we never reach them ,but like mariners , we chart our course by them