本文类的方法介绍包括类方法、属性方法、静态方法、修改属性方法等内置装饰器装饰的方法,以及类的一些特殊成员方法

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 # 报错

修改属性方法介绍实例

Python中类的各式方法介绍的更多相关文章

  1. Python中类的特殊方法详解

    本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助. 构造序列 1._len_(self) 2._getitem_(self,key) 3._setitem_(self,k ...

  2. 4 python 类的专有方法介绍

    1.__init__ : 构造函数,在生成对象时调用  该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但不一定有返回值. 所谓初始化构造函数就是在构造对象的同时被对象自动 ...

  3. python中类的魔法方法

    __xx__这种方法,在Python中均称为魔法方法 1.__init__(self) 该方法的作用是初始化对象 在创建对象时被默认调用,不需要手动调节 self参数不需要开发者传递,解释器会自动将创 ...

  4. python中类的定义方法

    # coding =utf-8 ## 类的定义 ##-------------------------------------------------- class Employee: empCoun ...

  5. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  6. Python 类中__init__()方法中的形参与如何修改类中属性的值

    一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...

  7. Python中类的相关介绍

    本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...

  8. python之魔法方法介绍

    1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...

  9. python中类中属性和方法的具体定义方法和使用

    1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...

随机推荐

  1. 使用json-path解析json

    在我们的日常开发中,有时候需要从一个json字符串中获取一个值,或者从一段json字符串中获取到某些值,如果先使用Gson或Jackson转换成java对象在获取值,有些时候是很麻烦的,那么有没有一种 ...

  2. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  3. 单片机STM32开发中常用库函数分析

    1.GPIO初始化函数 用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPI ...

  4. Machine learning(2-Linear regression with one variable )

    1.Model representation Our Training Set [训练集]: We will start with this ''Housing price prediction'' ...

  5. 转:基于 xilinx vivado 的PCIE ip核设置与例程代码详解

    连接:https://blog.csdn.net/u014586651/article/details/103826967#comments

  6. Ubuntu Python2 和 Python3 共存 切换

    例如 你写了代码 创建一个文件 在终端 vim test.py 然后写入代码 print "hello world" 接着运行代码 python test.py 会输出 hello ...

  7. ReentrantLock & AQS

    概念 Syncronized由于其使用的不灵活性,逐渐的被抛弃~ 常用解决方案,有以下三种使用方式:(暂时的不考虑condition的应用,暂时还没有总结出来) 同步普通方法,锁的是当前对象. 同步静 ...

  8. 记一次 Java 导出大批量 Excel 优化

    常用的excel导出方案,详情见Spring Boot 入门(十二):报表导出,对比poi.jxl和esayExcel的效率,其中jxl.esayEscel 底层都是基于 poi,它们仅仅是对 poi ...

  9. Kioskcached(2) 之 使用tcmalloc 替换 ptmalloc

    前言 我在 Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比 中找到的一个问题是 malloc,对于一个内存型数据库,很容易 ...

  10. linux下c语言实现简单----线程池

    这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用.线程的优点有好多,它是"轻量级的进程",所需资源 ...