绑定方法

对象的绑定方法/类的绑定方法

对象的绑定方法:

#1.对象的绑定方法
class ThisIsPerson:
    address = 'LiuHe'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def print_info(self): #这就是一个绑定给对象的方法
        print('%s😄%s是老板,%s岁' % (self.address, self.name, self.age))
obj6 = ThisIsPerson('tiandi', 23)
#注意,用对象来调用没有传入参数,因为参数就是调用的对象本身
obj6.print_info()    
LiuHe😄tiandi是老板,23岁
​
#1.默认情况下,在类中定义的函数就是绑定方法
#2.当用对象本身来调用类中的方法时,默认会把对象本身作为参数传入方法中。而用类名调用时则需要传入参数(对象)。
obj6 = ThisIsPerson('tiandi', 23)
ThisIsPerson.print_info(obj6)
#这就是用类名进行调用,必须传入被绑定对象作为参数
LiuHe😄tiandi是老板,23岁
​
总结:
#1.默认情况下,在类中定义的函数就是绑定方法
#2.当用对象本身来调用类中的方法时,默认会把对象本身作为参数传入方法中。而用类名调用时则需要传入参数(对象)。

类的绑定方法@classmethod

#类的绑定方法,可以由对象来调
class Person:
    '''
    注释的内容

    '''
    def __init__(self,name,age):
        # print(self)
        self.name=name
        self.age=age
    @classmethod
    def test(cls):
        print(cls)
        print('类的绑定方法')

# Person.test()
p=Person('nick',18)
#对象可以调用类的绑定方法,也是把该对象的类传入
p.test()

总结:

  • classmethod 是个装饰器,放在类中的函数上面,该函数就变成了类的绑定方法
  • 类的绑定方法由类来调用,自动把类传过去(对象也可以调,一般不用)

@staticmethod非绑定方法

对象和类都可以调用,但是不会自动传值

作用:

  • 跟类和对象都没有关系的时候,可以定义成静态方法,一般在类内部使用,类外部也可以使用
  • 就是一个普通函数,想把它拿到类中管理,就可以定义成静态方法
class Person:
    def __init__(self,name, age):
        self.id=self.get_uuid()
        self.name = name
        self.age = age

    #当成一个普通函数,只不过是写在类内部的
    @staticmethod
    def static_method():
        print('我是静态方法,谁都不绑定')
    @staticmethod
    def get_uuid():
        import uuid
        return uuid.uuid4()

@classmethod与statimethod的区别

import settings
class MySQL:
    def __init__(self,host,port):
        self.host=host
        self.port=port

    @staticmethod
    def from_conf():
        return MySQL(settings.HOST,settings.PORT)

    # @classmethod #哪个类来调用,就将哪个类当做第一个参数传入
    # def from_conf(cls):
    #     return cls(settings.HOST,settings.PORT)

    def __str__(self):
        return '就不告诉你'

class Mariadb(MySQL):
    def __str__(self):
        return '<%s:%s>' %(self.host,self.port)


m=Mariadb.from_conf()
print(m) #我们的意图是想触发Mariadb.__str__,但是结果触发了MySQL.__str__的执行,打印就不告诉你: