初学者python笔记(类的内置属性)
文章目录
- 1、isinstance与issubclass判断方法
- 2、__getattribute__方法
- 3、item系列
- 4、__str__与__repr__方法
- 5、自定制格式化方法
- 6、__doc__描述属性
- 7、__del__析构
- 8、__call__方法
- 9、迭代器协议
- 10、迭代器协议实现斐波那契数列
前几篇关于Python面向对象编程的文章也介绍了一部分类的一些内置方法和属性,本篇文章总结的是类的一些其他内置方法及属性
1、isinstance与issubclass判断方法
isinstance(obj,cls): 判断obj对象是否为类cls的实例
issubclass(Bar,Foo): 判断Bar是否为Foo的子类
class Foo:passobj = Foo()
print(isinstance(obj,Foo)) #判断obj是否为Foo的实例class Bar(Foo): #继承Foo类passobj2 = Bar()
print(issubclass(Bar,Foo)) #判断Bar是否为Foo的子类#继承后的子类实例化的对象也是父类的实例
print(isinstance(obj2,Foo))print(type(obj2)) #查看obj2的类型,其实就是它所属的类
运行结果:
2、__getattribute__方法
属性有或没有都会触发__getattribute__方法,它也是Python内置的报错机制原理
class Foo:y = 2020def __init__(self,x):self.x= x+1def __getattr__(self,item): #item为必须参数print('%s属性不存在,触发__getattr__方法' %item)def __getattribute__(self,item):print('正在触发__getattribute__方法')#只要有getattribute在,就会先触发它,无论调用的属性是否存在raise AttributeError('抛出异常了')#加上raise AttributeError语句,触发__getattribute__方法后,#若属性不存在,则才会触发__getattr__方法#若加上raise TabError语句,则不会再触发__getattr__方法,直接终止程序#raise TabError('抛出异常了')#实例化
p1 = Foo(1313)
p1.zzzzzz #调用一个不存在的属性
AttributeError结果:
TabError结果:
3、item系列
有这三个:
getitem
setitem
delitem
class Test:y = 2020def __init__(self,x):self.x= x+1def __getitem__(self,item): #item为必须参数print('正在执行__getitem__方法')def __delitem__(self,item):print('正在触发__delitem__删除值')def __setitem__(self,key,value): #设置值的时候是加入属性字典里,所以传入的是键值对print('正在用__setitem__设置值')#__setattr__内必须有设置值的操作self.__dict__[key]= value #设置原属性字典#实例化
p1= Test(1313)
p1.age = 22 #正常情况的添加属性字典键值对#可以用字典的方式来赋值
p1['name'] = 'Zoro'#输出
print(p1.age,p1.name)
print(p1.__dict__)
#但是用__setitem__赋值的属性不会出现在属性字典里
#和__getattr__\__setattr__\__delattr__类似,只是item是基于字典的方式来处理
#调用不存在的属性触发__getitem__,删除操作触发__delitem__p1['zzzzzzz'] #调用不存在的属性
del p1['age'] #删除属性
运行结果:
4、__str__与__repr__方法
class Foo:def __init__(self,name,age):self.name= nameself.age= agedef __str__(self):return '名字是%s,年龄是%s' %(self.name,self.age) #必须设置一个返回值def __repr__(self):return '名字是%s,年龄是%s' %(self.name,self.age) #必须设置一个返回值#实例化
p1= Foo('View',22)
print(p1) #就会默认输出__str__内的返回值,相当于print(str(p1))repr(p1)
#repr在解释器里面用,相当于p1.__repr__()
运行结果:
5、自定制格式化方法
#定义可供选择的字典
format_dic={'ymd':'{0.year}{0.month}{0.day}','m-d-y':'{0.month}-{0.day}-{0.year}','y:m:d':'{0.year}:{0.month}:{0.day}',
}class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = daydef __format__(self,format_spec): #定义一个__format__方法print('正在执行__format__方法')#做一个默认格式,当选择为空或者不规范(不在选择字典的key中)时就用这个输出if not format_spec or format_spec not in format_dic:fm = format_dic['ymd'] #默认格式else:fm = format_dic[format_spec] #取格式,即从字典取值return fm.format(self) #将self参数中的值用fm的格式返回,fm即为自定义格式#实例化
d1 = Date(2020,3,17)
print(format(d1,'y:m:d')) #用键来取值供选择的字典
#执行对象d1下的__fromat__方法,并输出返回值
#第一个参数传给self,第二个参数传给format_spec表示你选择的格式
print(format(d1,'ymm')) #一个不存在的格式将按默认格式输出
运行结果:
6、__doc__描述属性
class Foo:'这是Foo的描述信息'passclass Bar(Foo):passprint(Foo.__dict__)
print(Foo.__dict__) #描述信息也被继承了,所以两个字典里都有该键值对
运行结果:
7、__del__析构
析构函数: 整个类被执行完毕了,即内存被释放了才触发,或者将整个类产生的对象删除了
class Foo:def __init__(self,name,age):self.name = nameself.age = agedef __del__(self):print('该类已执行完毕!')
p = Foo('View',22)
del p
print('--------------->')
运行结果:
8、__call__方法
作用分析:一个对象加()就是在调用生成它的类下的__call__方法
class Foo:def __call__(self,*args,**kwargs):print('实例带括号,执行啦')f = Foo() #实例化
f()
运行结果:
9、迭代器协议
class Foo:def __init__(self,x):self.x = xdef __iter__(self): return self #将属性变成可迭代对象#既然有__iter__方法,一定要有__next__方法,才可以正常遍历def __next__(self):self.x += 1if self.x == 530: #设置迭代的终止条件为达到530就停止raise StopIteration('迭代结束!')return self.x #将传入的值加1,作为返回值f1 = Foo(519) #实例化
print(f1.__next__()) #用__next__方法让它向后遍历
print(f1.__next__())
print(next(f1))
print(next(f1))for i in f1: #遍历f1,实质上就是iter(f1)---->f1.__iter__()print(i) #输出每次遍历得到的值
运行结果:
10、迭代器协议实现斐波那契数列
斐波那契数列概念:
这个数列从第3项开始,每一项都等于前两项之和。
下面用迭代器+类与对象来实现:
class Fib:def __init__(self):self.a=1 #定义两个初始值a,bself.b=1def __iter__(self):return self #将属性字典变成可迭代对象def __next__(self): #定义用来迭代的next方法self.a,self.b = self.b, self.a+self.b#将b的值赋值给a,即后面的一个数给前面的变量#将a+b的值赋值给b,即前一个数和后一个数的和赋值给后一个变量#设置停止条件if self.a > 100:raise StopIteration("斐波那契数列已遍历到指定长度")return self.a #返回第一个值p1 = Fib() #实例化
for i in p1: #遍历可迭代对象print(i)
运行结果:
初学者python笔记(类的内置属性)相关推荐
- python 面向对象 类的内置方法
判断是不是类cls的对象 class A:passa = A() print(isinstance(a,A)) 判断类sub是不是super的子类 class A:passclass B(A):pas ...
- python笔记——常用的内置函数
官方说明文档:https://docs.python.org/3/library/functions.html 内置函数 abs() 函数返回(数字)的绝对值 all() 如果()里的所有元素不为0. ...
- python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...
一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...
- python的类里的属性是否可以为列表_是否有Python方法可以访问类的所有非私有和非内置属性?...
我想调用一种方法给我一个所有"非私有"的词典(我在这里使用"私有"一词,因为它在 Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像 ...
- 初学者python笔记(静态属性、类方法、静态方法、类的组合)
文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...
- 初学者python笔记(内置函数_2)
这篇初学者笔记是接着上一篇初学者python笔记(内置函数_1)的.同样都是介绍Python中那些常用内置函数的. max()和min()的高级用法 我们都知道,max():取最大值,min():取最 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- Python学习10 内置属性 对象属性 类属性 私有属性 私有方法 对象方法 类方法 静态方法
内置属性 创建类时系统自动创建的属性 # 内置属性:dir(对象),列出所有的内置属性 class Person(object):'''Person类1'''# Person类2__slots__ = ...
- 类的属性、类的方法、类的内置方法
类的属性 变量在类中称为类的属性,函数在类中称为类的方法,类的属性分为以下几种: (1) 公有属性:在类中和类外都能调用的属性,定义的时候与变量的定义一致,如 color = 'yellow' (2) ...
最新文章
- 我了解到的新知识之——电热水器用电安全
- 10个Java 8 Lambda表达式经典示例
- python压缩包怎么安装-详解python解压压缩包的五种方法
- 深入理解JVM(6)——类加载器
- Leetcode 92.反转链表
- oracle调用存储过程和函数返回结果集
- .NET Core MVC扩展实践
- RUNOOB python练习题30 回文数
- Nginx(七):nginx原理解析
- 扩展中国剩余定理 exCRT 学习笔记
- Unity3d接入视频监控
- thriftserver与spark application的区别
- 松弛法(relaxation)
- C#中string[]数组和liststring泛型的相互转换 【转】
- SQL server 数据导入导出BCP工具使用详解
- 记录一个很好用的截图软件greenShot
- 盐城工学院c语言实验报告簿,盐城工学院单片机实验指导书.doc
- 数据库系统概论(第五版) 王珊 第一章课后习题答案
- vmware fusion 7 序列号
- php加入到jpg,PHP如何将PNG转换成JPG?
热门文章
- 计算机硬件能够直接识别的语言是英语,计算机硬件能直接识别、执行的语言是()...
- 知识计算机硬件 教学设计,“计算机硬件系统”教学设计
- 比特币支付接口php,比特币支付php类
- 计算机专业的口号运动会四字,计算机系运动会口号
- python矩阵赋值提高速度_Numpy大规模矩阵运算优化加速技巧
- android 10 apk 存储适配,AndroidQ(10) 分区存储适配方法
- python socket模块 和pyqt_使用PyQt和Socket进行聊天编程[标准库]
- mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
- matlab7.x答案,MATLAB习题及参考答案
- html剧场座位设计图,如何设计剧院座位,21个细部案例