Day 5-5 绑定方法与非绑定方法

绑定方法与非绑定方法:

在类内部定义的绑定方法,分两大类:

classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法

 1 #!_*_ coding:utf-8 _*_
 2 
 3 #类中绑定方法分两种:绑定给谁,就由谁来调用.默认就把调用者当作第一个参数传进去.
 4 
 5 #1.绑定到对象的方法:没有被任何装饰器修饰的方法.
 6 class F:
 7     def __init__(self, name, age):
 8         self.name = name
 9         self.age = age
10 
11     def tell(self):
12         print("name is %s " % self.name)
13 #__init__ 和tell方法都是对象p的绑定方法
14 
15 
16 p = F("JACK", 18)
17 print(p.tell)   # <bound method F.tell of <__main__.F object at 0x0044F9B0>>是一个绑定到F的方法.
18 
19 
20 
21 
22 #2.绑定到类的方法:用classmethod装饰器修饰的方法.
23 class F:
24     def __init__(self, name, age):
25         self.name = name
26         self.age = age
27 
28     def tell(self):
29         print("name is %s " % self.name)
30 
31     @classmethod
32     def func(cls):
33         print("from cls bound")
34 
35 p = F("JACK", 18)
36 
37 print(F.func) # <bound method F.func of <class '__main__.F'>> 绑定到类的方法.
38 
39 
40 #非绑定方法:
41 
42 class F:
43     def __init__(self, name, age):
44         self.name = name
45         self.age = age
46 
47     def tell(self):
48         print("name is %s " % self.name)
49 
50     @classmethod
51     def func(cls):
52         print("from cls bound")
53 
54     @staticmethod    # 加了这个装饰器,就变成了一个类中的普通工具(函数),对象和类都可以调用
55     def func1(x,y):
56         print(x * y)
57 
58 
59 
60 p = F("JACK", 18)
61 
62 p.func1(5,7)
63 F.func1(9,8)  # 类和对象都可以调用.正常传参数.
64 
65 
66 
67 
68 class F:
69     def __init__(self, name, age):
70         self.name = name
71         self.age = age
72 
73     def tell(self):
74         print("name is %s " % self.name)
75 
76     @classmethod
77     def func(cls):
78         print("from cls bound")
79 
80     @staticmethod    # 加了这个装饰器,就变成了一个类中的普通工具(函数),对象和类都可以调用
81     def func1(x,y):
82         return  x * y
83 
84 
85 
86 p = F("JACK", 18)
87 
88 print(p.func1(5,7))
89 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)
原文地址:https://www.cnblogs.com/lovepy3/p/8981037.html