Python中类的各式方法介绍
本文类的方法介绍包括类方法、属性方法、静态方法、修改属性方法等内置装饰器装饰的方法,以及类的一些特殊成员方法
1. 类的特殊成员方法
1.1 构造方法
# -*- coding:utf-8 -*- # Author:Wong Du class Foo(object): def __init__(self, name, age): ''' 构造方法,用来初始化实例变量,做一些初始化工作 :param name: :param age: ''' self.name = name self.age = age f = Foo('小明', 10) print(f.name, f.age)
1.2 析构方法
# -*- coding:utf-8 -*- # Author:Wong Du import time class Foo(object): def __init__(self, name, age): self.name = name self.age = age def __del__(self): ''' 析构方法,当对象从内存中释放时,自动触发执行 :return: ''' print("实例对象【%s】被释放了..." %self.name) f = Foo('小明', 10) print("干点不相干的事儿...") time.sleep(2) del f time.sleep(2) print("程序结束了...")
1.3 描述方法
# -*- coding:utf-8 -*- # Author:Wong Du class Foo(object): ''' 此处描述这个类的说明信息, 可用类实例名的__doc__方法查看描述信息 ''' def func(self): pass f = Foo() print(f.__doc__)
1.4 __call__方法
# -*- coding:utf-8 -*- # Author:Wong Du class Foo(object): def __init__(self, name, age): self.name = name self.age = age def __call__(self, *args, **kwargs): print("\033[31;1m类实例化后的对象名加括号时触发执行\033[0m") return args,kwargs f = Foo('Caiyun', 23) # 实例化时执行__init__() f() # f对象名加()时执行__call__() g = f(1,2,3,4,5,name='小明',age=10) print(g)
1.5 以字典的形式获取类或实例化对象的成员__dict__
# -*- coding:utf-8 -*- # Author:Wong Du ''' __dict__ 获取类的成员,即静态字段、方法 ''' class Country(object): def __init__(self, name, addr): self.name = name self.addr = addr def func(self, count): print(count) def __call__(self, *args, **kwargs): print("调用call方法") return args,kwargs obj = Country("哈佛",'美国') print(obj.__dict__) print(Country.__dict__)
1.6 __str__方法,打印类实例化对象时,执行该方法
# -*- coding:utf-8 -*- # Author:Wong Du class Foo(object): def __init__(self): pass def __str__(self): ''' 当打印类实例时, 输出__str__方法的返回值 :return: ''' return "Caiyun" f = Foo() print(f, Foo())
1.7 setitem&getitem&delitem方法
# -*- coding:utf-8 -*- # Author:Wong Du class Foo(object): ''' 用于索引操作,如字典。 以下分别表示获取、设置、删除数据 通过字典的三种操作格式触发下面的三种方法 ''' def __getitem__(self, item): print("__getitem__",item) def __setitem__(self, key, value): print("__setitem__",key,value) def __delitem__(self, key): print("__delitem__",key) obj = Foo() value = obj['key'] # 通过字典调用时,执行类下__getitem__方法 obj['newkey'] = 'newvalue' # 通过字典赋值时,执行类下__setitem__方法 del obj['key'] # 通过字典删除时,执行类下__delitem__方法
1.8 __new__方法,执行顺序优于构造方法
# -*- coding:utf-8 -*- # Author:Wong Du class Foo(object): def __new__(cls, *args, **kwargs): print("这是一个new方法,执行顺序优先于init") return args,kwargs def __init__(self): print("这是一个init构造函数...") obj = Foo()
1.9 type建类,__metaclass__创建元类
# -*- coding:utf-8 -*- # Author:Wong Du # type创建类格式 # type(类名,(父类,),{函数名:已定义好的函数, 变量名:变量值}) def bar(): print("In the bar...") obj = type('Foo',(),{'bar':bar, 'name':'Caiyun'}) obj.bar() print(obj.name) # print(type(obj)) # 创建元类,可以为创建类定制类的共有样式 def upper_attr(class_name, class_parents, class_attr): attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__')) attrs_upper = dict((name.upper(), value) for name, value in attrs) return type(class_name, class_parents, attrs_upper) __metaclass__ = upper_attr obj = upper_attr('name',(),{'age':23,'name':'CAiyub'}) print(obj, type(obj)) print(hasattr(obj,'age')) print(hasattr(obj,'AGE')) print(obj.AGE,obj.NAME)
2. 类的内置装饰器装饰方法
2.1 类方法
类方法只能访问类里的类变量,不能访问类里的实例变量,一般来说,有构造函数初始化的变量为实例变量
# -*- coding:utf-8 -*- # Author:Wong Du ''' 类的类方法 通过@classmethod装饰器可将一个函数方法装饰成一个类方法 类方法只能访问类里的类变量,不能访问类里的实例变量 ''' class ClassMethod(object): ''' 这是一个用于介绍类方法使用实例的类 ''' author = "CaiYun" def __init__(self, name, age): ''' 构造函数,用于初始化实例变量name,age :param name: :param age: ''' self.name = name self.age = age @classmethod def classmethod(self): ''' 这是一个类方法 用来访问类变量和实例变量, 演示类方法的特点 :return: ''' print("\033[31;1m我是一个类方法,我只能访问类变量,不能访问实例变量...\033[0m") try: print("\033[32;1m我想访问类变量author: %s\033[0m" %self.author) print("\033[32;1m我想访问实例变量name: %s\033[0m" %self.name) except Exception as e: print("\033[33;1m捕获到异常: %s\033[0m" %e) return self.author c = ClassMethod("小明", 10) print(c.author, c.name, c.age) c.classmethod() # print(c.classmethod())
2.2 静态方法
静态方法不能访问类里的类变量和实例变量,相较其他方法而言比较独立
# -*- coding:utf-8 -*- # Author:Wong Du ''' 类的静态方法 通过@staticmethod装饰器可将一个函数方法装饰成一个静态方法 静态方法不能访问类里的类变量和实例变量,相较其他方法而言比较独立 ''' class StaticMethod(object): ''' 这是一个模拟静态方法使用实例的类 ''' author = "CaiYun" def __init__(self, name, age): ''' 构造方法,创建实例变量name,age :param name: :param age: ''' self.name = name self.age = age @staticmethod def staticmethod(self, name, age): ''' 静态方法里面的形参author,name, 和类里的author,self.name是两个不同的变量 它们相互独立,互不干扰 :param self: 必须赋值,与类构造函数中的self没有关系 :param name: :param age: :return: ''' print("\033[31;1m我是一个静态方法,我无法访问类变量和实例变量...\033[0m") try: print("我想访问类变量author: ",author) except Exception as e: print("\033[32;1m捕获到异常: %s\033[0m" %e) else: print("成功访问到类变量author...") return name, age, self.name s = StaticMethod("小明", 10) print(s.author,s.name,s.age) # s.staticmethod('小红', 9) # print(s.staticmethod("小白", 8)) s.staticmethod(s,'小红', 9) print(s.staticmethod(s,"小白", 8))
2.3 属性方法
属性方法即把函数方法装饰成类的一个属性,通常情况下不进行修改,常见于监测系统状态变化的函数
# -*- coding:utf-8 -*- # Author:Wong Du ''' 类的属性方法 通过@property装饰器可将一个函数方法装饰成一个静态属性 ''' # Part1 class Property(object): ''' 这是一个模拟属性方法使用实例的类 ''' def __init__(self, name, age): ''' 构造函数,用来初始化实例变量name,age :param name: :param age: ''' self.name = name self.age = age @property def property(self, salary=None): ''' @property把这个方法封装成了一个静态属性 :param salary: :return: ''' msg = '''\033[34;1m -----%s INFO----- Name: %s Age: %s Salary: %s\033[0m''' \ %(self.name.upper(), self.name, self.age, salary) print(msg) return 'done' p = Property("小明", 10) print(p.name, p.age) # p.property() # 会报错,因为property已经变成一个静态属性了,不能这样调用 p.property
''' Part2 属性方法应用实例:查询航班状态 ''' import random class Flight(object): ''' 查询航班状态,属性方法应用实例 ''' def __init__(self, flight_name): ''' 构造函数,初始化实例变量flight_name :param flight_name: ''' self.flight_name = flight_name def flight_check(self): ''' 查询航班状态,返回对应标志位 :return: ''' print("\033[32;1m查询【%s】的航班状态信息...\033[0m" %self.flight_name) return random.randint(0,4) #0~4随机区一个整数返回 @property def flight_status(self): ''' 检查航班查询返回的标志位信息,输出相应的状态信息 :return: ''' status = self.flight_check() if status == 0: print("\033[33;1m航班【%s】还没到起点站...\033[0m" %self.flight_name) elif status == 1: print("\033[33;1m航班【%s】已经开始检票了...\033[0m" %self.flight_name) elif status == 2: print("\033[33;1m航班【%s】即将停止检票(剩余5分钟)...\033[0m" %self.flight_name) elif status == 3: print("\033[33;1m航班【%s】已经起飞了...\033[0m" %self.flight_name) elif status == 4: print("\033[33;1m航班【%s】已经到达终点站了...\033[0m" %self.flight_name) else: pass f = Flight('AY12138') f.flight_status
2.4 修改属性方法
可通过其他装饰器修改属性方法
# -*- coding:utf-8 -*- # Author:Wong Du ''' 属性方法应用实例:查询航班状态 补充属性方法的修改和删除 ''' import random class Flight(object): ''' 查询航班状态,属性方法应用实例 补充属性方法的修改和删除用法 ''' def __init__(self, flight_name): ''' 构造函数,初始化实例变量flight_name :param flight_name: ''' self.flight_name = flight_name def flight_check(self): ''' 查询航班状态,返回对应标志位 :return: ''' print("\033[32;1m查询【%s】的航班状态信息...\033[0m" %self.flight_name) return random.randint(0,4) #0~4随机区一个整数返回 @property def flight_status(self): ''' 检查航班查询返回的标志位信息,输出相应的状态信息 :return: ''' status = self.flight_check() if status == 0: print("\033[33;1m航班【%s】还没到起点站...\033[0m" %self.flight_name) elif status == 1: print("\033[33;1m航班【%s】已经开始检票了...\033[0m" %self.flight_name) elif status == 2: print("\033[33;1m航班【%s】即将停止检票(剩余5分钟)...\033[0m" %self.flight_name) elif status == 3: print("\033[33;1m航班【%s】已经起飞了...\033[0m" %self.flight_name) elif status == 4: print("\033[33;1m航班【%s】已经到达终点站了...\033[0m" %self.flight_name) else: print("\033[33;1m航班【%s】信息查询失败,请重试...\033[0m" %self.flight_name) @flight_status.setter def flight_status(self, status, name='航班机长' ): ''' 修改flight_status静态属性 :param status: :param name: :return: ''' status_dic = { 0:'\033[33;1m航班【%s】还没到起点站...\033[0m' %self.flight_name, 1:'\033[33;1m航班【%s】已经开始检票了...\033[0m' %self.flight_name, 2:'\033[33;1m航班【%s】即将停止检票(剩余5分钟)...\033[0m' %self.flight_name, 3:'\033[33;1m航班【%s】已经起飞了...\033[0m' %self.flight_name, 4:'\033[33;1m航班【%s】已经到达终点站了...\033[0m' %self.flight_name, 5:'\033[33;1m航班【%s】信息查询失败,请重试...\033[0m' %self.flight_name, } print("\033[31;1m您好,我是%s,很抱歉,\033[0m" %name) print("\033[31;1m%s 航班状态信息发生了改变:\033[0m" %self.flight_name,status_dic.get(status)) @flight_status.deleter def flight_status(self): ''' 删除静态属性flight_status :return: ''' del Flight.flight_status print("\033[34;1m查询航班状态的方法已被删除...\033[0m") f = Flight('AY12138') f.flight_status # 查询 f.flight_status = 2 # 修改,给属性赋值时调用flight_status.setter下函数 del f.flight_status # 删除,此时调用@flight_status.deleter下的函数 f.flight_status # 报错
静静的学习一阵子儿...