绑定方法、非绑定方法与静态方法


类中定义的函数分为两大类

一、绑定方法

绑定给谁,谁来调用就会将它自身当做第一个参数传入:

1、绑定给类的方法:用classmethod装饰器装饰的方法。

给类使用,类名.boud_method()自动将类作为第一个参数传入。

2、绑定给对象的方法:没有被任何装饰器装饰的方法。

给对象使用,对象.boud_method()自动将对象作为第一个参数传入,通过类调用时仅为普通函数。

二、非绑定方法

用staticmethod装饰器装饰的方法,不与类或对象绑定,类和对象都可以调用,但不会自动传值,仅为普通函数。


绑定方法

绑定给对象的方法请看之前笔记;绑定给类的方法:classmethod

被classmethod装饰后的方法是绑定给类使用的,类在使用时会将类本身当做参数传给类方法的第一个参数(约定俗成为cls),即便是对象类调用也会将类当作第一个参数传入。

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

    @classmethod
    def obj_lisi(cls):
        return cls('李四',20,'male')  # 每次实例化对象都会固定为这三个属性。

lisi = Person.obj_lisi()
print(lisi.name)  # 李四

张三 = lisi.obj_lisi()  # 对象调用默认传的第一个参数也是类。
print(张三.name)  # 李四

绑定给类的方法通常用来作为一种新的实例化对象的方式,比如从文件中读取内容实例化出对象。


非绑定方法

在类内部用staticmethod装饰的函数即为非绑定方法,本质就是普通函数,也被称为静态方法。

staticmethod装饰的函数不与类或对象绑定,谁都可以调用,不会自动传参数。

class Coder:
    @staticmethod
    def f1(x):
        print(x)

Coder.f1(2)  # 类来调用
print(Coder.f1)
libai = Coder()
libai.f1(10)  # 对象来调用
print(libai.f1)

2
10
2
<function Coder.f1 at 0x0000000001E1B670>  # 普通函数
10
<function Coder.f1 at 0x0000000001E1B670>  # 普通函数

在类内部也可以调用静态方法:

class Coder:
    def __init__(self):
        self.age = Coder.my_age()  # 或者对象来调用self.my_age()

    @staticmethod
    def my_age():
        return 18

libai = Coder()
print(libai.age)

18

是使用绑定给对象的方法、绑定给类的方法还是静态方法取决于是否需要向方法内的代码体传入对象或者类,亦或者都不需要则使用静态方法。

原文地址:https://www.cnblogs.com/ChiRou/p/14206713.html