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 # 报错
修改属性方法介绍实例
Python中类的各式方法介绍的更多相关文章
- Python中类的特殊方法详解
本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助. 构造序列 1._len_(self) 2._getitem_(self,key) 3._setitem_(self,k ...
- 4 python 类的专有方法介绍
1.__init__ : 构造函数,在生成对象时调用 该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但不一定有返回值. 所谓初始化构造函数就是在构造对象的同时被对象自动 ...
- python中类的魔法方法
__xx__这种方法,在Python中均称为魔法方法 1.__init__(self) 该方法的作用是初始化对象 在创建对象时被默认调用,不需要手动调节 self参数不需要开发者传递,解释器会自动将创 ...
- python中类的定义方法
# coding =utf-8 ## 类的定义 ##-------------------------------------------------- class Employee: empCoun ...
- Python 类的魔术方法
Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...
- Python 类中__init__()方法中的形参与如何修改类中属性的值
一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...
- Python中类的相关介绍
本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...
- python之魔法方法介绍
1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...
- python中类中属性和方法的具体定义方法和使用
1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...
随机推荐
- Manjaro / ArchLinux 安装网易云音乐解决搜索不能输入中文方法
0. 安装网易云音乐 yay -S netease-cloud-music 1.先安装qcef这个软件包. sudo yay -S qcef 2.编辑/opt/netease/netease-clou ...
- $dy$讲课总结
字符串: 1.广义后缀自动机(大小为\(m\))上跑一个长度为\(n\)的串,所有匹配位置及在\(parent\)树上其祖先的数量的和为\(min(n^2,m)\),单次最劣是\(O(m)\). 但是 ...
- 难搞的C语言指针你搞懂了多少
C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...
- 常用Java API:HashMap 和 TreeMap
摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实现,是无序的 clear()//清空. containsKey(Obje ...
- 如何使用原生的Ribbon
什么是Ribbon 之前分析了如何使用原生的Feign,今天我们来研究 Netflix 团队开发的另外一个类库--Ribbon. Ribbon 和 Feign 有很多相似的地方,首先,它们本质上都是 ...
- xmake v2.5.9 发布,改进 C++20 模块,并支持 Nim, Keil MDK 和 Unity Build
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- 如何减小微信小程序代码包大小
原作于:https://captnotes.com/how_to_reduce_package_size_of_weapp 这两天被小程序代码包大小暴涨的问题困扰了挺久.简单说说怎么回事吧,就是之前好 ...
- rocketmq有序消息的(四)
opic的有序消息已经成为mq的标配.而RocketMQ中是这样区分消息类型的, 普通消息也叫做无序消息,简单来说就是没有顺序的消息,而有序消息就是按照一定的先后顺序的消息类型.举个例子,produc ...
- S2-002漏洞分析
漏洞概述 Struts2-002是一个 XSS 漏洞,该漏洞发生在 <s:url> 和 <s:a>标签中,未对标签内字符进行转义,当标签的属性 includeParams=al ...
- 菜鸡的Java笔记 第二十一 final 关键字
使用final定义类,属性,方法 final在一些书中被称为终结器,意思是:利用final定义的类不能够有子类,利用final定义的方法不能够被覆写,利用final定义的变量就成 ...