我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python面向对象编程Day 27部分

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python面向对象编程Day 27部分

isinstance(obj,cls)检查obj是否是类cls的实例,反映族谱关系(不仅父类可以,父类的父类也可以) 

issubclass(subcls,cls)检查subcls是否是cls的子类

 

__getattribute__属性存不存在都会触发它 ‘大哥’ 里面抛出Attribute Error时交给小弟处理

__getattr__属性不存在触发 ‘小弟

 

item是字典方式触发的

__setitem__

__getitem__

__delitem__

 1 class Foo:
 2     def __getitem__(self, item):
 3         print('getitem',item)
 4         return self.__dict__[item]
 5 
 6     def __setitem__(self, key, value):
 7         print('setitem')
 8         self.__dict__[key]=value
 9 
10     def __delitem__(self, key):
11         print('delitem')
12         self.__dict__.pop(key)
13 
14 f1=Foo()
15 print(f1.__dict__)
16 # f1.name='egon'  #---->点触发attr系列方法
17 f1['name']='egon'  #--->中括号字典形式触发item系列方法
18 f1['age']=18
19 
20 print('===>',f1.__dict__)
21 
22 # del f1.name
23 # print(f1.__dict__)
24 25 # print(f1.age)
26 del f1['name']
27 print(f1.__dict__)
28 
29 print(f1['age'])

输出

{}
setitem
setitem
===> {'name': 'egon', 'age': 18}
delitem
{'age': 18}
getitem age
18

 

 1 class Foo:
 2     def __init__(self,name,age):
 3         self.name=name
 4         self.age=age
 5     def __repr__(self):
 6         return 'this is repr'
 7     # def __str__(self):
 8     #     return 'this is str'
 9 f1=Foo('cy',23)
10 print(f1)   #str(f1)-->f1.__str__()

输出

this is repr

 

 

st函数或者print函数--->obj.__str__()

repr函数或者交互式解释器--->obj.__repr__()

如果__str__没被定义,那就使用__repr__来代替输出

str和repr返回的必须是字符串,否则抛出异常

 

 1 format_dic={
 2     'ymd':'{0.year}{0.mon}{0.day}',
 3     'm-d-y':'{0.mon}-{0.day}-{0.year}',
 4     'y:m:d':'{0.year}:{0.mon}:{0.day}'
 5 }
 6 class Date:
 7     def __init__(self,year,mon,day):
 8         self.year=year
 9         self.mon=mon
10         self.day=day
11     def __format__(self, format_spec):
12         print('执行__format__方法')
13         print('--->',format_spec)
14         if not format_spec or format_spec not in format_dic:
15             format_spec='ymd'
16         fm=format_dic[format_spec]
17         return fm.format(self)
18 d1=Date(2016,12,26)
19 # format(d1) #d1.__format__()
20 print('没设置格式,采用默认格式==>',format(d1))
21 print(format(d1,'ymd'))
22 print(format(d1,'y:m:d'))
23 print(format(d1,'m-d-y'))
24 print('已设定格式但格式不存在,采用默认格式==>',format(d1,'m-d:y'))

输出

执行__format__方法
--->
没设置格式,采用默认格式==> 20161226
执行__format__方法
---> ymd
20161226
执行__format__方法
---> y:m:d
2016:12:26
执行__format__方法
---> m-d-y
12-26-2016
执行__format__方法
---> m-d:y
已设定格式但格式不存在,采用默认格式==> 20161226

 

(慎用)是一个类变量,变量值可以是字符串、列表、元组或者可迭代对象(意味着所有实例只有一个数据属性)

  为何使用__slots__?优势在于省内存(字典会占用大量内存,如果有一个属性很少的类,但是有很多实例,为了节省内存可以使用__slots__取代实例的__dict__,设置了__slots__之后,__dict__就没了)

  使用点来访问属性本质就是在访问类或对象的__dict__属性字典(类的字典是共享的,而每个实例是独立的)

  特点:不允许设置其他数据属性。  

  

 1 class Foo:
 2     __slots__=['name','age']  #{'name':None,'age':None}
 3     # __slots__='name' #{'name':None,'age':None}
 4 
 5 f1=Foo()
 6 # f1.name='egon'
 7 # print(f1.name)
 8 
 9 # f1.age=18  #--->setattr----->f1.__dict__['age']=18
10 
11 # print(f1.__dict__)
12 print(Foo.__slots__)
13 print(f1.__slots__)
14 f1.name='egon'
15 f1.age=17
16 print(f1.name)
17 print(f1.age)
18 # f1.gender='male'
19 
20 
21 f2=Foo()
22 print(f2.__slots__)
23 f2.name='alex'
24 f2.age=18
25 print(f2.name)
26 print(f2.age)

输出

['name', 'age']
['name', 'age']
egon
17
['name', 'age']
alex
18

 

定义于开头用来说明文档信息的一个字符串,且无法被继承。

写不写都有,不写默认是None。

 

查看实例来自哪个模块  对象.__module__

查看实例是什么类  对象.__class__

 

此方法一般无需定义,因为python是门高级语言,使用时无需关心内存的分配和释放,此工作交由python解释器执行,所以析构函数的调用是由解释器在进行垃圾回收时自动触发执行的,文件执行完毕之后触发该函数执行。

 1 class Foo:
 2     def __init__(self,name):
 3         self.name=name
 4     def __del__(self):
 5         print('我执行啦')
 6 
 7 f1=Foo('alex')
 8 
 9 # del f1    #删除实例会触发__del__
10 del f1.name #删除实例的属性不会触发__del__
11 print('--------------------->')
12 
13 #程序运行完毕会自动回收内存,触发__del__

输出

--------------------->
我执行啦

 

对象后面加括号,触发执行。

 

 

 1 class Foo:
 2     def __init__(self,n):
 3         self.n=n
 4     def __iter__(self):
 5         return self
 6 
 7     def __next__(self):
 8         if self.n == 13:
 9             raise StopIteration('终止了')
10         self.n+=1
11         return self.n
12 
13 f1=Foo(10)
14 
15 for i in f1:  # obj=iter(f1)------------>f1.__iter__()
16      print(i)  #obj.__next__()

输出

11
12
13

 

  迭代器协议实现斐波那契数列

 

 1 class Fib:
 2     def __init__(self):
 3         self._a=1
 4         self._b=1
 5 
 6     def __iter__(self):
 7         return self
 8     def __next__(self):
 9         if self._a > 100:
10             raise StopIteration('终止了')
11         self._a,self._b=self._b,self._a + self._b
12         return self._a
13 
14 f1=Fib()
15 print(next(f1))
16 print(next(f1))
17 print(next(f1))
18 print(next(f1))
19 print(next(f1))
20 print('==================================')
21 for i in f1:
22     print(i)

输出

1
2
3
5
8
==================================
13
21
34
55
89
144

 

(开发大型框架时用到)

本质是一个新式类,至少实现了__get__()/__set__()/__delete__()中的一个,这也被成为描述符协议。

  __get__():调用一个属性时触发

  __set__():为一个属性赋值时触发

  __delete__():采用del删除属性时触发

描述符有什么用?描述符的作用是用来代理另外一个类的属性的

描述符分为两种:

  数据描述符:至少实现了__get__()和__set__()

  非数据描述符:没实现__set__()

注意事项:

  1.描述符本身应该定义成新式类,被代理的类也应该是新式类;

  2.必须把描述符定义成类属性,而不能定义到构造函数中;

  3.要严格遵循该优先级,从高到低:

    类属性---数据描述符---实例属性---非数据描述符---找不到的属性触发__getattr__()

 

例:

 1 class Foo:
 2     def __get__(self, instance, owner):
 3         print('===>get方法')
 4     def __set__(self, instance, value):
 5         print('===>set方法',instance,value)
 6         instance.__dict__['x']=value #对b1.__dict__进行修改
 7     def __delete__(self, instance):
 8         print('===>delete方法')
 9 
10 class Bar:
11     x=Foo() #描述符定义位置 在何地?   x用描述符来描述
12     def __init__(self,n):
13         self.x=n #b1.x=10 触发Foo的set方法
14 #触发在何时?
15 b1=Bar(10)  #在执行赋值操作
16 print(b1.__dict__)
17 b1.x=1  #在执行赋值操作
18 print(b1.__dict__)
19 
20 b1.y=2  #没有触发set,因为变量y并没用描述符描述
21 print(b1.__dict__)

输出

===>set方法 <__main__.Bar object at 0x000001CDBB0197B8> 10
{'x': 10}
===>set方法 <__main__.Bar object at 0x000001CDBB0197B8> 1
{'x': 1}
{'x': 1, 'y': 2}

 

优先级的体现

 1 class Foo:
 2     def __get__(self, instance, owner):
 3         print('===>get方法')
 4     def __set__(self, instance, value):
 5         print('===>set方法',instance,value)
 6         instance.__dict__['x']=value #b1.__dict__
 7     def __delete__(self, instance):
 8         print('===>delete方法')
 9 
10 class Bar:
11     x=Foo()
12 Bar.x=1    #覆盖类属性,改变了Bar的__dict__
13 print(Bar.__dict__)
14 print(Bar.x)

输出

{'__module__': '__main__', 'x': 1, '__dict__': <attribute '__dict__' of 'Bar' objects>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': None}
1

 

反序列化的时候要保证类还在内存中。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python面向对象编程Day 27部分

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python面向对象编程Day 27部分

isinstance(obj,cls)检查obj是否是类cls的实例,反映族谱关系(不仅父类可以,父类的父类也可以) issubclass(subcls,cls)检查subcls是否是cls的子类 __getattribute__属性存不存
2023-01-30

Python面向对象编程Day 26部分

五大数据类型:整型、字符串、列表、元组、字典多态概念指出了对象如何通过他们共同的属性和动作来操作和访问,而不需考虑他们具体的类、多态表明了动态(又名:运行时)绑定的存在,允许重载及运行时类型确定和验证。多态是继承的改变和扩展的实现机制,即调
2023-01-30

Python面向对象编程Day 25部分

实例化的时候python会自动把实例本身传给self__dict__ 查看属性类调用的时候不会自动传递参数  s1.tell_info()  School.tell_info(s1)增 .key=什么;减 del;改 =;查 .调用 类属性
2023-01-30

Python面向对象编程Day 24部分

三大编程范式(方法论):面向过程编程、函数式编程、面向对象编程。类与对象  类:把一类事物的相同的特征和动作整合到一起就是类,是抽象的概念。  对象:基于类而创建的一个具体的事物,也是特征和动作整合到一起。面向对象设计OOD:将一类具体事物
2023-01-30

Python面向对象编程Day 28部分

with obj as f:  '代码块'1.with obj --->触发obj.__enter__(),拿到返回值2.as f ---> f=返回值3.with obj as f 等同于 f=obj.__enter__()4.执行代码块
2023-01-30

Python面向对象编程

面向对象最重要的概念就是类(Class)和实例(Instance),Java比较熟了,下面贴代码注释 class Student(object): def __init__(self, name, score): sel
2023-01-30

Python-面向对象编程

面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如人类、动物类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。以人类为例,创建一个实例为 xiaoming
2023-01-31

Python面向对象编程实例分析

本文小编为大家详细介绍“Python面向对象编程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python面向对象编程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是面向对象编程(类)利用(
2023-06-29

Python面向对象编程 一

一、类    面向对象是对函数进行分类和封装,其主要目的是提高程序的重复实用性,让开发更方便快捷。    在我们的认知中,我们会根据属性相近的东西归为一类。例如:鱼类,鱼类的共同属性是呼吸,卵生。任何一个鱼都在此鱼类基础上创建的。    定
2023-01-31

Python OOP 面向对象编程

参考:黑马程序员教程 - Python基础 面向对象OOP三大特性,且三个特性是有顺序的:封装继承多态封装指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。唯一要注意的就是:推荐从小往大开
2023-01-31

Python面向对象编程基础

面向对象编程是Python中的核心之一,面向对象的核心并不是概念,语法,使用有多么复杂,而是一种编程思想,并不是掌握了类创建与使用就真正掌握了面向对象编程,这需要在不断工作与练习中逐步提升;抛去代码,我们先来看现实世界的基本概念:类:我们最
2023-01-31

python面向对象编程小结

这个是跟着教程一步一步走过来的,所以记下自己学习的过程。一、类基础1、类的定义class <类名>:    <其他语句>class <类名>(父类名):    <其他语句>>>> class human:  ...     age=0 ..
2023-01-31

Python 面向对象编程详解

这篇文章主要介绍了Python 面向对象编程详解的相关资料,需要的朋友可以参考下
2022-12-30

【python】面向对象编程之@prop

@property装饰器作用:把一个方法变成属性调用使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法 @property&@.setterclass Person(objec
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录