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

一:绑定方法(绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数传入):

  1. 绑定到类的方法:用classmethod装饰器装饰的方法。

  2. 绑定到对象的方法:在类内定义的没有被任何装饰器修饰的

二:非绑定方法

  非绑定方法:不与类或对象绑定,没有自动传值一说,就是类中定义的一个普通工具,类和对象都能使用

class Foo:
    def __init__(self, name):
        self.name = name

    def tell(self):
        print('名字是%s' %self.name)

    @classmethod
    def func(cls):  # cls是class的缩写,提示这是绑定到类的方法  cls=Foo
        print(cls)

    @staticmethod
    def func1(x, y):
        return x + y

# 绑定到对象的方法,对象是调用者,直接把对象作为参数传入
f = Foo('egon')
print(Foo.tell)  # <function Foo.tell at 0x0000027FCC1A8840>
print(f.tell)  # <bound method Foo.tell of <__main__.Foo object at 0x0000027FCC101390>>

# 绑定到类的方法,类是调用者,直接把类作为参数传入
print(Foo.func())  # <class '__main__.Foo'>
print(Foo)  # <class '__main__.Foo'>

# 非绑定方法,不存在自动传值一说,类和对象都能调用
print(Foo.func1)  # <function Foo.func1 at 0x0000025AF41F8BF8>
print(f.func1)  # <function Foo.func1 at 0x0000025AF41F8BF8>

 绑定方法与非绑定方法的使用

import settings, hashlib, time

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

    def tell_info(self):  # 绑定到对象的方法
        print('Name: %s  Age: %s  Sex: %s' % (self.name, self.age, self.sex))

    @classmethod
    def from_conf(cls):
        obj = cls(
            settings.name,
            settings.age,
            settings.sex
        )
        return obj

    @staticmethod
    def creat_id( ):
        m = hashlib.md5(str(time.time()).encode('utf-8'))
        return m.hexdigest()

# 绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入
p = People('egon', 18, 'male')
p.tell_info()  # tell_info(p)  Name: egon  Age: 18  Sex: male

# 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入
p = People.from_conf()  # from_conf(People)
p.tell_info()  # Name: alex  Age: 18  Sex: female

# 非绑定方法,不与类或对象绑定,谁都可以调用,没有自动传值一说
p1 = People('egon1', 18, 'male')
p2 = People('egon2', 28, 'male')

print('P1>>%s \nP2>>%s'%(p1.id, p2.id))  # P1>>3f983deaffdb39bbfc92cc721ccd74cf \n P2>>3f983deaffdb39bbfc92cc721ccd74cf