一、绑定方法
绑定方法的特殊之处在于将调用者本身当做第一个参数自动传入
(一)绑定给对象的方法:调用者是对象,自动传入的是对象
在类中正常定义的函数默认是绑定到对象的,我们举一个输出ip地址的例子:
class interweb:
def __init__(self, ip, port):
self.ip = ip
self.port = port
def ipaddress(self):
print('%s:%s' % (self.ip, self.port))
ip = interweb('127.0.0.1', '8888')
ip.ipaddress() # 127.0.0.1:8888
我们要先实例化ip对象,还要传入'127.0.0.1', '8888'进行初始化。
(二)绑定给类的方法:调用者是类,自动传入的是类
在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到了类。就会实现在类进行此函数调用时,会把类本身当做第一个参数自动传入的效果。
class interweb:
def __init__(self, ip, port):
self.ip = ip
self.port = port
def ipadress(self):
print('%s:%s' % (self.ip, self.port))
@classmethod
def func(x): # x = interweb
return x('127.0.0.1', '8888')
ip = interweb.func() # 相当于 --> ip = interweb('127.0.0.1', '8888')
ip.ipadress() # 127.0.0.1:8888
我们通过在类中定义一个给类使用的绑定方法func,并在其中提前进行了初始化,故而我们进行实例化对象时,可以直接使用此方法进行实例化,就省去了进行初始化的步骤。
在上例中,func函数的形参是x,传入的是类名。我们对此进行了规范,将此参数名统一命名为cls。
@classmethod
def func(cls):
return cls('127.0.0.1', '8888')
二、非绑定方法
非绑定方法又被称为静态方法,即没有绑定给任何人:调用者可以是类、对象,没有自动传参的效果
为类中某个函数加上装饰器@staticmethod后,该函数就变成了非绑定方法,也称为静态方法。该方法不与类或对象绑定,类与对象都可以来调用它,但它就是一个普通函数而已,因而没有自动传值那么一说。
我们来举一个例子:
class interweb:
def __init__(self, ip, port):
self.ip = ip
self.port = port
def ipdress(self):
print('%s:%s' % (self.ip, self.port))
@staticmethod
def func():
print('这是由某一个小程序猿使用世界上最牛B的语言定义的类。')
print('孙悟空到此一游,楼主牛B!')
print('鲁智深到此一游,楼主牛B,楼上的牛B!')
总结绑定方法与非绑定方法的使用:
若类中需要一个功能,该功能的实现需要代码中引用对象,则将其定义成对象方法;需要引用类,则将其定义成类绑定方法;无需引用类或对象则将其定义成静态方法。
三、对函数知识的补充——函数的类型提示
提示信息:紧跟在“形参名+冒号”之后,通常用来提示数据类型,但也可以自定义。
函数定义第一行末尾冒号前的“ ->信息”也是提示信息,这里提示的是返回值的相关信息,通常提示数据类型,同样可以自定义。
def register(name: str, age: int, hobbies: tuple) -> int:
print(name, age, hobbies)
return 111
def register(name: "必须传入名字字符串", age: '是整型年龄不是年份', hobbies: "必须传入爱好元组") -> "返回的是整型":
print(name, age, hobbies)
return 111
当提示信息和形参默认值同时出现时,写法是“形参名:提示信息 = 默认值”
def register(name: str = '张三', age: int = 18, hobbies: tuple = (1, 2)) -> int:
print(name, age, hobbies)
return 111
函数名._ _annotations_ _可以查看写下的所有提示信息,结果是一个字典类型。
print(register.__annotations__)
提示信息丝毫不会影响程序,跟注释信息的作用一样。除要求情况下,就算不按照提示的数据类型传参也不会有异常报错。