• 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("33[31;1m类实例化后的对象名加括号时触发执行33[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("33[31;1m我是一个类方法,我只能访问类变量,不能访问实例变量...33[0m")
            try:
                print("33[32;1m我想访问类变量author: %s33[0m" %self.author)
                print("33[32;1m我想访问实例变量name: %s33[0m" %self.name)
            except Exception as e:
                print("33[33;1m捕获到异常: %s33[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("33[31;1m我是一个静态方法,我无法访问类变量和实例变量...33[0m")
            try:
                print("我想访问类变量author: ",author)
            except Exception as e:
                print("33[32;1m捕获到异常: %s33[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 = '''33[34;1m
            -----%s INFO-----
                Name: %s
                Age: %s
                Salary: %s33[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("33[32;1m查询【%s】的航班状态信息...33[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("33[33;1m航班【%s】还没到起点站...33[0m" %self.flight_name)
            elif status == 1:
                print("33[33;1m航班【%s】已经开始检票了...33[0m" %self.flight_name)
            elif status == 2:
                print("33[33;1m航班【%s】即将停止检票(剩余5分钟)...33[0m" %self.flight_name)
            elif status == 3:
                print("33[33;1m航班【%s】已经起飞了...33[0m" %self.flight_name)
            elif status == 4:
                print("33[33;1m航班【%s】已经到达终点站了...33[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("33[32;1m查询【%s】的航班状态信息...33[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("33[33;1m航班【%s】还没到起点站...33[0m" %self.flight_name)
            elif status == 1:
                print("33[33;1m航班【%s】已经开始检票了...33[0m" %self.flight_name)
            elif status == 2:
                print("33[33;1m航班【%s】即将停止检票(剩余5分钟)...33[0m" %self.flight_name)
            elif status == 3:
                print("33[33;1m航班【%s】已经起飞了...33[0m" %self.flight_name)
            elif status == 4:
                print("33[33;1m航班【%s】已经到达终点站了...33[0m" %self.flight_name)
            else:
                print("33[33;1m航班【%s】信息查询失败,请重试...33[0m" %self.flight_name)
    
        @flight_status.setter
        def flight_status(self, status, name='航班机长' ):
            '''
            修改flight_status静态属性
            :param status:
            :param name:
            :return:
            '''
            status_dic = {
                0:'33[33;1m航班【%s】还没到起点站...33[0m' %self.flight_name,
                1:'33[33;1m航班【%s】已经开始检票了...33[0m' %self.flight_name,
                2:'33[33;1m航班【%s】即将停止检票(剩余5分钟)...33[0m' %self.flight_name,
                3:'33[33;1m航班【%s】已经起飞了...33[0m' %self.flight_name,
                4:'33[33;1m航班【%s】已经到达终点站了...33[0m' %self.flight_name,
                5:'33[33;1m航班【%s】信息查询失败,请重试...33[0m' %self.flight_name,
            }
            print("33[31;1m您好,我是%s,很抱歉,33[0m" %name)
            print("33[31;1m%s 航班状态信息发生了改变:33[0m" %self.flight_name,status_dic.get(status))
    
        @flight_status.deleter
        def flight_status(self):
            '''
            删除静态属性flight_status
            :return:
            '''
            del Flight.flight_status
            print("33[34;1m查询航班状态的方法已被删除...33[0m")
    
    
    f = Flight('AY12138')
    f.flight_status            # 查询
    f.flight_status = 2     # 修改,给属性赋值时调用flight_status.setter下函数
    del f.flight_status     # 删除,此时调用@flight_status.deleter下的函数
    f.flight_status    # 报错
    修改属性方法介绍实例
  • 相关阅读:
    含字母数字的字符串排序算法,仿Windows文件名排序算法
    WCF、WPF、Silverlight和区别(转)
    线程组的介绍
    python基础字符串的修改
    c语言
    python 字典
    单元测试相关
    python列表
    如何才能设计出好的测试用例
    字符串查找
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/9480485.html
Copyright © 2020-2023  润新知