绑定方法与非绑定方法

在类内部定义的函数,分为两大类:
一、绑定方法:绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数自动传入
      a、绑定到对象的方法:在类内部定义的没有内任何装饰器修饰的
      b、绑定到类的方法:在类内部定义的被装饰器classmethod修饰的
二、非绑定方法:没有自动传值,就是类中定义的一个普通工具,对象和类都可以使用 (被装饰器staticmethod修饰)

      非绑定方法:不与类或者对象绑定(类和对象都可用)。

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

    def tell(self):     # 类内部定义的函数是绑定给对象使用的
        print("名字是%s" %self.name)

    @classmethod
    def func(cls):    # cls = Foo
        print(cls)

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


f = Foo("alex")
# # print(Foo.tell)
# # Foo.tell(f)
# # print(f.tell)    # 绑定方法的特殊之处是绑定给谁就由谁来调用,自动传入第一个参数
#
# print(Foo.func)
# Foo.func()
# print(Foo)


print(Foo.func1)
print(f.func1)

Foo.func1(1,2)
f.func1(1,3)

使用场景

import settings,hashlib,time
class People:
    def __init__(self,name,age,sex):
        self.id = self.create_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 create_id():
        m = hashlib.md5(str(time.time()).encode("utf-8"))
        return m.hexdigest()


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

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

# 非绑定方法,不与类或对象绑定,谁都可以调用,没有自动传值一说
p1 = People("alex1",18,"male")
p2 = People("alex2",28,"male")
p3 = People("alex3",38,"male")
print(p1.id)
print(p2.id)
print(p3.id)

  

  

原文地址:https://www.cnblogs.com/fantsaymwq/p/9919282.html