绑定方法与非绑定方法:
在类内部定义的绑定方法,分两大类:
classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法
#!_*_ coding:utf-8 _*_ #类中绑定方法分两种:绑定给谁,就由谁来调用.默认就把调用者当作第一个参数传进去. #1.绑定到对象的方法:没有被任何装饰器修饰的方法.
class F:
def __init__(self, name, age):
self.name = name
self.age = age def tell(self):
print("name is %s " % self.name)
#__init__ 和tell方法都是对象p的绑定方法 p = F("JACK", 18)
print(p.tell) # <bound method F.tell of <__main__.F object at 0x0044F9B0>>是一个绑定到F的方法. #2.绑定到类的方法:用classmethod装饰器修饰的方法.
class F:
def __init__(self, name, age):
self.name = name
self.age = age def tell(self):
print("name is %s " % self.name) @classmethod
def func(cls):
print("from cls bound") p = F("JACK", 18) print(F.func) # <bound method F.func of <class '__main__.F'>> 绑定到类的方法. #非绑定方法: class F:
def __init__(self, name, age):
self.name = name
self.age = age def tell(self):
print("name is %s " % self.name) @classmethod
def func(cls):
print("from cls bound") @staticmethod # 加了这个装饰器,就变成了一个类中的普通工具(函数),对象和类都可以调用
def func1(x,y):
print(x * y) p = F("JACK", 18) p.func1(5,7)
F.func1(9,8) # 类和对象都可以调用.正常传参数. class F:
def __init__(self, name, age):
self.name = name
self.age = age def tell(self):
print("name is %s " % self.name) @classmethod
def func(cls):
print("from cls bound") @staticmethod # 加了这个装饰器,就变成了一个类中的普通工具(函数),对象和类都可以调用
def func1(x,y):
return x * y p = F("JACK", 18) print(p.func1(5,7))
print(F.func1(9,8))
1.凡是类中的方法和函数,都是绑定给对象使用的;
2.绑定方法都有自动传值的功能。传递进去的值,就是对象本身。
3.如果类想调用绑定方法,就必须遵循函数的参数规则,有几个参数,就必须传递几个参数。
应用场景:
#!_*_ coding:utf-8 _*_
import settings
import time
import hashlib
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 is %s Aage is %s Sex is %s,ID is %s." % (self.name,self.age,self.sex, self.id) ) @classmethod
def from_settings(cls): # 绑定到类的方法
obj = cls(
settings.name,
settings.age,
settings.sex
)
return obj
@staticmethod
def creat_id(): # 非绑定方法,谁都可以调用
time.sleep(0.00000000000000001) # 加了细微的延时,不然生成的ID都一样
m = hashlib.md5()
m.update(bytes(str(time.time()),encoding="utf-8"))
return m.hexdigest() p = People("Lu", 20 ,"女")
p.tell_info() # 绑定给对象,就由对象来调用,把对象作为第一个参数传进去
p = People.from_settings() # 绑定给类,由类来调用,把类作为第一个参数传进去.
p.tell_info() p1 = People("Lucy", 18 ,"女")
p2 = People("Lili", 22 ,"女")
p3 = People("Luma", 38 ,"女")
print(p1.id)
print(p2.id)
print(p3.id)