文章目录

  • 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笔记(类的内置属性)相关推荐

  1. python 面向对象 类的内置方法

    判断是不是类cls的对象 class A:passa = A() print(isinstance(a,A)) 判断类sub是不是super的子类 class A:passclass B(A):pas ...

  2. python笔记——常用的内置函数

    官方说明文档:https://docs.python.org/3/library/functions.html 内置函数 abs() 函数返回(数字)的绝对值 all() 如果()里的所有元素不为0. ...

  3. python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...

    一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...

  4. python的类里的属性是否可以为列表_是否有Python方法可以访问类的所有非私有和非内置属性?...

    我想调用一种方法给我一个所有"非私有"的词典(我在这里使用"私有"一词,因为它在 Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像 ...

  5. 初学者python笔记(静态属性、类方法、静态方法、类的组合)

    文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...

  6. 初学者python笔记(内置函数_2)

    这篇初学者笔记是接着上一篇初学者python笔记(内置函数_1)的.同样都是介绍Python中那些常用内置函数的. max()和min()的高级用法 我们都知道,max():取最大值,min():取最 ...

  7. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  8. Python学习10 内置属性 对象属性 类属性 私有属性 私有方法 对象方法 类方法 静态方法

    内置属性 创建类时系统自动创建的属性 # 内置属性:dir(对象),列出所有的内置属性 class Person(object):'''Person类1'''# Person类2__slots__ = ...

  9. 类的属性、类的方法、类的内置方法

    类的属性 变量在类中称为类的属性,函数在类中称为类的方法,类的属性分为以下几种: (1) 公有属性:在类中和类外都能调用的属性,定义的时候与变量的定义一致,如 color = 'yellow' (2) ...

最新文章

  1. 我了解到的新知识之——电热水器用电安全
  2. 10个Java 8 Lambda表达式经典示例
  3. python压缩包怎么安装-详解python解压压缩包的五种方法
  4. 深入理解JVM(6)——类加载器
  5. Leetcode 92.反转链表
  6. oracle调用存储过程和函数返回结果集
  7. .NET Core MVC扩展实践
  8. RUNOOB python练习题30 回文数
  9. Nginx(七):nginx原理解析
  10. 扩展中国剩余定理 exCRT 学习笔记
  11. Unity3d接入视频监控
  12. thriftserver与spark application的区别
  13. 松弛法(relaxation)
  14. C#中string[]数组和liststring泛型的相互转换 【转】
  15. SQL server 数据导入导出BCP工具使用详解
  16. 记录一个很好用的截图软件greenShot
  17. 盐城工学院c语言实验报告簿,盐城工学院单片机实验指导书.doc
  18. 数据库系统概论(第五版) 王珊 第一章课后习题答案
  19. vmware fusion 7 序列号
  20. php加入到jpg,PHP如何将PNG转换成JPG?

热门文章

  1. 计算机硬件能够直接识别的语言是英语,计算机硬件能直接识别、执行的语言是()...
  2. 知识计算机硬件 教学设计,“计算机硬件系统”教学设计
  3. 比特币支付接口php,比特币支付php类
  4. 计算机专业的口号运动会四字,计算机系运动会口号
  5. python矩阵赋值提高速度_Numpy大规模矩阵运算优化加速技巧
  6. android 10 apk 存储适配,AndroidQ(10) 分区存储适配方法
  7. python socket模块 和pyqt_使用PyQt和Socket进行聊天编程[标准库]
  8. mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
  9. matlab7.x答案,MATLAB习题及参考答案
  10. html剧场座位设计图,如何设计剧院座位,21个细部案例