Python 绑定方法与非绑定方法、函数类型提示

49 阅读3分钟

一、绑定方法

绑定方法的特殊之处在于将调用者本身当做第一个参数自动传入

(一)绑定给对象的方法:调用者是对象,自动传入的是对象

在类中正常定义的函数默认是绑定到对象的,我们举一个输出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__)

提示信息丝毫不会影响程序,跟注释信息的作用一样。除要求情况下,就算不按照提示的数据类型传参也不会有异常报错。