面向对象进阶——类中的方法
类中的方法,其实就是类中定义的函数,可以分为:绑定方法、非绑定方法。
一、绑定方法
绑定方法:绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数自动传入
1、绑定到对象的方法
在类内定义的没有被任何装饰器修饰的
特点:为对象量身定制;
对象.bound_method(),自动将对象当做第一个参数传入(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说
)
2、绑定到类的方法
在类内定义的被装饰器@classmethod修饰的方法
特点:为类量身定制;
类.bound_method(),自动将类当做第一个参数传入(其实对象也可以调用,但仍将类作为第一个参数传入)
二、非绑定方法(@staticmethod)
非绑定方法:在类中用@staticmethod装饰器装饰的方法。
特点:不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已。
1、与绑定到对象方法区别
在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值;
而staticmethod装饰的方法(非绑定方法),不管谁来调用,都没有自动传值一说。
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('egon') print(Foo.tell) print(f.tell) """ <function Foo.tell at 0x104021378> <bound method Foo.tell of <__main__.Foo object at 0x101fb6390>> """ print(Foo.func) """ <bound method Foo.func of <class '__main__.Foo'>> """ Foo.func() """ <class '__main__.Foo'> """ print(Foo.func1) f.func1(1, 3) Foo.func1(2, 4) """ <function Foo.func1 at 0x104021488> 4 6 """
2、绑定方法和非绑定方法的应用
现有配置文件settings.py
name = 'alex' age = 18 sex = 'female'
运用类的方法,查看配置文件信息:
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 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('egon',18,'male') # 绑定给对象,就应该由对象来调用,自动将对象本身当做第一个参数传入 p.tell_info() # tell_info(p) """ Name egon Age 18 Sex male """ # 绑定给类,就应该由类来调用,自动将类本身当做第一个参数传入 p=People.from_conf() # from_conf(People) p.tell_info() """ Name alex Age 18 Sex female """ # 非绑定方法,不与类或对象绑定,谁都可以调用,没有自动传值一说 p1 = People('egon1', 18, 'male') p2 = People('egon2', 28, 'male') p3 = People('egon3', 38, 'male') print(p1.id) print(p2.id) print(p3.id) """ a653d2ce4826a31051d7ddd13a9d82cf 4c0f5168f3a2fdb96a37430380d336e4 b214300c918bc319b840077dfdbb8425 """