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    # 报错
修改属性方法介绍实例
原文地址:https://www.cnblogs.com/Caiyundo/p/9480485.html