首页 » 编程 » Python » Python学习 » 面向对象 » 正文

绑定方法与非绑定方法

定义

在类内部定义的函数,分为两大类:
一、绑定方法:绑定给谁就应该由谁来调用,谁来调用就会把调用者当作第一个参数自动传入
    1. 绑定到对象的方法:在类内定义的没有被任何装饰器修饰的

    2. 绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法

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

 

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

    def tell(self):  # 绑定给对象的方法
        print("名字是%s" % self.name)

    @classmethod  # 绑定给类的方法
    def func(cls):
        print(cls)

    @staticmethod  # 非绑定方法
    def func1(x, y):
        print(x + y)


f = Foo("alex")  # 实例化一个对象

# 绑定给对象的方法验证
print(Foo.tell)  # 通过内直接调用自己内部的函数,他就是函数,函数需要的参数该怎么传就怎么传。
# 这里输出:<function Foo.tell at 0x00000141A7FAA950>
Foo.tell(f)  # 输出:名字是alex

print(f.tell)  # 通过对象来调,tell就是绑定方法了,会自动传递第一个参数。
# 这里输出:<bound method Foo.tell of <__main__.Foo object at 0x000001FCB5E899E8>>


# 绑定给类的方法验证
print(Foo.func)  # 通过classmethod装饰器将func变成了绑定方法  <bound method Foo.func of <class '__main__.Foo'>>
Foo.func()  # 现在通过类直接调用func就自动传第一个参数了

# 非绑定方法,通过staticmethod装饰器将func1设定为非绑定方法,参数该怎么传就怎么传
Foo.func1(1, 2)  # 输出:3
f.func1(1, 2)  # 输出:3

应用

import settings
import hashlib
import 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 get_conf(cls):
        obj = cls(settings.name, settings.age, settings.sex)
        return obj

    @staticmethod
    def create_id():
        m = hashlib.md5()
        m.update(bytes(str(time.time()), encoding="utf-8"))
        return m.hexdigest()


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

# 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入
p2 = People.get_conf()
p2.tell_info()  # 输出:Name:jack Age:28 Sex:female

# 非绑定方法,不与类或者对象绑定,谁可以调用,没有自动传值一说
p3 = People("alex3", 22, "male")
p4 = People("alex4", 22, "male")
p5 = People("alex5", 22, "male")
print(p3.id)  # 输出:c23b8f50aaf2fab3ec1bb96288cc5e92
print(p4.id)  # 输出:12dd9cc43fc3a9450ec0537d29984c38
print(p5.id)  # 输出:557e593136da4b7f9f0f309baff4ae17

小注意一下:如果再Windows下运行,上面的md5可能会一样,应该实例化时time.time()得到的值都是一样的,不知道为什么,在linux下没问题。

 

赞 (0)

发表评论

*