返回顶部
首页 > 资讯 > 后端开发 > Python >Python面向对象编程Day 28部分
  • 525
分享到

Python面向对象编程Day 28部分

面向对象PythonDay 2023-01-30 22:01:58 525人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

 with obj as f:

  '代码块'

1.with obj --->触发obj.__enter__(),拿到返回值

2.as f ---> f=返回值

3.with obj as f 等同于 f=obj.__enter__()

4.执行代码块

两种情况:

  没有异常的情况下,整个代码块运行完毕后去触发__exit__,它的三个参数都为None

  有异常的情况下,会从异常出现的位置直接触发__exit__,此时分两种情况:

      如果__exit__的返回值为True,代表吞掉了异常

      如果__exit__的返回值不为True,代表吐出了异常

      (exit的运行完毕就代表了整个with语句的执行完毕,异常后代码块内的语句不会执行)

 

用途:使用with语句的目的是省去手动清理的过程,另外在需要管理一些资源比如文件,网络连接和编程环境中,可以在__exit__中定制自动释放资源的机制。

 

异常构成简单了解

异常类,异常值,追踪信息 分别对应exc_type/exc_val/exc_tb

 

 1 class Typed:
 2     def __init__(self,key,expected_type):
 3         self.key=key
 4         self.expected_type=expected_type
 5     def __get__(self, instance, owner): #instance是p1实例
 6         print('get方法')
 7         return instance.__dict__[self.key]
 8     def __set__(self, instance, value):
 9         print('set方法')
10         if not isinstance(value,self.expected_type):
11             raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type))
12         instance.__dict__[self.key]=value
13     def __delete__(self, instance):
14         print('delete方法')
15         instance.__dict__.pop(self.key)
16 
17 class People:
18     name=Typed('name',str) #t1.__set__()  self.__set__()
19     age=Typed('age',int) #t1.__set__()  self.__set__()
20     def __init__(self,name,age,salary):
21         self.name=name
22         self.age=age
23         self.salary=salary
24 
25 p1=People(213,13,13.3)

输出

Traceback (most recent call last):
File "G:/BaiduNetdiskDownload/第04阶段-python3面向对象编程(24-28)/python全栈s3 day028/day28课上代码/描述符的应用.py", line 41, in <module>
p1=People(213,13,13.3)
File "G:/BaiduNetdiskDownload/第04阶段-Python3面向对象编程(24-28)/python全栈s3 day028/day28课上代码/描述符的应用.py", line 36, in __init__
self.name=name
File "G:/BaiduNetdiskDownload/第04阶段-Python3面向对象编程(24-28)/python全栈s3 day028/day28课上代码/描述符的应用.py", line 25, in __set__
raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type))
TypeError: name 传入的类型不是<class 'str'>

 

 

 1 def deco(obj):
 2     print('==========',obj)
 3     obj.x=1
 4     obj.y=2
 5     obj.z=3
 6     return obj
 7 
 8 @deco #Foo=deco(Foo)
 9 class Foo:
10     pass
11 
12 print(Foo.__dict__)

输出

========== <class '__main__.Foo'>
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None, 'x': 1, 'y': 2, 'z': 3}

 

 

自定制property实现延迟计算功能

 1 class Lazyproperty:
 2     def __init__(self,func):
 3         # print('==========>',func)
 4         self.func=func
 5     def __get__(self, instance, owner):
 6         print('get')
 7         if instance is None:
 8             return self
 9         res=self.func(instance) #函数运行的时候要把实例本身传进去,而不是类
10         setattr(instance,self.func.__name__,res)
11         return res
12     # def __set__(self, instance, value):  
13     #     pass
14 
15 class Room:
16     def __init__(self,name,width,length):
17         self.name=name
18         self.width=width
19         self.length=length
20     @Lazyproperty  # area=Lazypropery(area)
21     def area(self):
22         return self.width * self.length
23     @property  # area1=property(area1)
24     def area1(self):
25         return  self.width * self.length
26 
27 r1=Room('厕所',1,1)
28 print(r1.__dict__)
29 
30 # 实例调用
31 print(r1.area)
32 print(r1.__dict__)
33 print(Room.__dict__)
34 
35 # 类调用    被描述符代理的属性 instance传的是None owner不变
36 print(Room.area)
37 
38 # 不再调用get方法,因为此时有实例属性,
39 # 其优先级高于非数据描述符 若此时加上set属性就无法实现了
40 print(r1.area)
41 print(r1.area)

 输出

{'name': '厕所', 'width': 1, 'length': 1}
get
1
{'name': '厕所', 'width': 1, 'length': 1, 'area': 1}
{'__module__': '__main__', '__init__': <function Room.__init__ at 0x000001EFB23EA620>, 'area': <__main__.Lazyproperty object at 0x000001EFB07D8908>, 'area1': <property object at 0x000001EFB0799688>, '__dict__': <attribute '__dict__' of 'Room' objects>, '__weakref__': <attribute '__weakref__' of 'Room' objects>, '__doc__': None}
get
<__main__.Lazyproperty object at 0x000001EFB07D8908>
1
1

 

 property补充

 1 class Foo:
 2     @property
 3     def AAA(self):
 4         print('get的时候运行我啊')
 5 
 6     # 下面两个函数依附于静态属性存在
 7     @AAA.setter
 8     def AAA(self,val):
 9         print('set的时候运行我啊',val)
10     @AAA.deleter
11     def AAA(self):
12         print('del的时候运行我啊')
13 #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
14 f1=Foo()
15 f1.AAA
16 f1.AAA='aaa'
17 del f1.AAA

#另一种写法,效果一样
class Foo:

def get_AAA(self):
print('get的时候运行我啊')
def set_AAA(self,val):
print('set的时候运行我啊',val)
def del_AAA(self):
print('del的时候运行我啊')

AAA=property(get_AAA,set_AAA,del_AAA)  #顺序不要变
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA
 

输出

get的时候运行我啊
set的时候运行我啊 aaa
del的时候运行我啊

 

type元类是类的类,是类的模板。元类是用来控制如何创建类的,正如类是创建对象的模板一样。元类的实例为类,正如类的实例为对象。

1 def say_hi(name):
2     return('hello,%s'%name)
3 FFo=type('FFo',(object,),{'gender':'female','say_hi':say_hi})
4 print(FFo)
5 print(FFo.__dict__)
6 print(FFo.say_hi('chenyuan'))
7 print('Your gender is %s'%FFo.gender)

输出

<class '__main__.FFo'>
{'gender': 'female', 'say_hi': <function say_hi at 0x000001CF9911C1E0>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'FFo' objects>, '__weakref__': <attribute '__weakref__' of 'FFo' objects>, '__doc__': None}
hello,chenyuan
Your gender is female

实例调用函数,会自动把实例本身传进去当参数,而类调用函数时如果需要得写self

 

自定制元类

 1 class MyType(type):
 2     def __init__(self,a,b,c):
 3         print('元类的构造函数执行')
 4         # print(a)
 5         # print(b)
 6         # print(c)
 7     def __call__(self, *args, **kwargs):
 8         # print('=-======>')
 9         # print(self)
10         # print(args,kwargs)
11         obj=object.__new__(self) #object.__new__(Foo)-->f1
12         self.__init__(obj,*args,**kwargs)  #Foo.__init__(f1,*arg,**kwargs)
13         return obj
14 class Foo(metaclass=MyType): #Foo=MyType(Foo,'Foo',(),{})---》__init__
15     def __init__(self,name):
16         self.name=name #f1.name=name
17 # print(Foo)
18 # f1=Foo('alex')
19 # print(f1)
20 
21 f1=Foo('alex')
22 print(f1)
23 print(f1.__dict__)

输出

元类的构造函数执行
<__main__.Foo object at 0x0000025A13005048>
{'name': 'alex'}

--结束END--

本文标题: Python面向对象编程Day 28部分

本文链接: https://lsjlt.com/news/179773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python面向对象编程Day 28部分
     with obj as f:   '代码块' 1.with obj --->触发obj.__enter__(),拿到返回值 2.as f ---> f=返回值 3.with obj as f 等同于 f=obj.__ent...
    99+
    2023-01-30
    面向对象 Python Day
  • Python面向对象编程Day 25部分
    实例化的时候python会自动把实例本身传给self __dict__ 查看属性 类调用的时候不会自动传递参数   s1.tell_info()   School.tell_info(s1) 增 .key=什么;减 del;改 =;查 ....
    99+
    2023-01-30
    面向对象 Python Day
  • Python面向对象编程Day 24部分
    三大编程范式(方法论):面向过程编程、函数式编程、面向对象编程。 类与对象   类:把一类事物的相同的特征和动作整合到一起就是类,是抽象的概念。   对象:基于类而创建的一个具体的事物,也是特征和动作整合到一起。 面向对象设计OOD:将一...
    99+
    2023-01-30
    面向对象 Python Day
  • Python面向对象编程Day 26部分
    五大数据类型:整型、字符串、列表、元组、字典 多态概念指出了对象如何通过他们共同的属性和动作来操作和访问,而不需考虑他们具体的类、多态表明了动态(又名:运行时)绑定的存在,允许重载及运行时类型确定和验证。多态是继承的改变和扩展的实现机制...
    99+
    2023-01-30
    面向对象 Python Day
  • Python面向对象编程Day 27部分
    isinstance(obj,cls)检查obj是否是类cls的实例,反映族谱关系(不仅父类可以,父类的父类也可以)  issubclass(subcls,cls)检查subcls是否是cls的子类   __getattribute__...
    99+
    2023-01-30
    面向对象 Python Day
  • day 22 - 1 面向对象
    面向对象 字典实现人狗大战 #定义角色 def Person(name,hp,aggr,sex): person = { 'name':name, 'hp':hp, 'aggr':...
    99+
    2023-01-30
    面向对象 day
  • python 面向对象编程
    文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 ...
    99+
    2023-08-31
    python 开发语言
  • Python面向对象编程
      面向对象最重要的概念就是类(Class)和实例(Instance),Java比较熟了,下面贴代码注释   class Student(object): def __init__(self, name, score): ...
    99+
    2023-01-30
    面向对象 Python
  • Python-面向对象编程
    面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如人类、动物类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。 以人类为例,创建一个实例为 xiaomi...
    99+
    2023-01-31
    面向对象 Python
  • Python面向对象编程实例分析
    本文小编为大家详细介绍“Python面向对象编程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python面向对象编程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是面向对象编程(类)利用(...
    99+
    2023-06-29
  • Python面向对象编程(三)
    目录一、isinstance和issubclass二、反射(hasattr和getattr和setattr和delattr)1、反射在类中的使用2、反射在模块中的使用3、实例:基于反...
    99+
    2024-04-02
  • Python面向对象编程(二)
    目录一、对象的继承1、类的构造函数继承__init__():2、继承关系中,对象查找属性的顺序二、类的派生1、派生方法一(类调用)2、派生方法二(super)三、类的组合四、多父类继...
    99+
    2024-04-02
  • Python面向对象编程(一)
    目录一、程序中定义类和对象1、 定义类2、 定义对象二、定制对象独有特征1、引入2、定制对象独有特征3、对象属性查找顺序4、类定义阶段定制属性三、对象的绑定方法1、类使用对象的绑定对...
    99+
    2024-04-02
  • python 面向对象编程(2)
    文章目录 前言封装多态类属性和实例属性定义以及访问类属性修改类属性实例属性 类方法静态方法 前言 前面我们介绍了 python 类和对象以及继承、私有权限,那么今天我们将来介绍 py...
    99+
    2023-08-31
    python 开发语言
  • Python面向对象编程 一
    一、类    面向对象是对函数进行分类和封装,其主要目的是提高程序的重复实用性,让开发更方便快捷。    在我们的认知中,我们会根据属性相近的东西归为一类。例如:鱼类,鱼类的共同属性是呼吸,卵生。任何一个鱼都在此鱼类基础上创建的。    定...
    99+
    2023-01-31
    面向对象 Python
  • Python OOP 面向对象编程
    参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的...
    99+
    2023-01-31
    面向对象 Python OOP
  • 5 Python的面向对象编程
    概述         在上一节,我们介绍了Python的函数,包括:函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中,我们将介绍Python的面向对象编程。面向对象编程(Object-Oriented Programmi...
    99+
    2023-08-31
    python 面向对象 继承 运算符重载
  • 【python】面向对象编程之@prop
      @property装饰器作用:把一个方法变成属性调用 使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法   @property&@.setter class ...
    99+
    2023-01-31
    面向对象 python prop
  • Python面向对象高级编程
      1、__slots__ Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性 class Student(object): __slots__ = ('name',...
    99+
    2023-01-30
    面向对象 高级编程 Python
  • python面向对象编程小结
    这个是跟着教程一步一步走过来的,所以记下自己学习的过程。 一、类基础 1、类的定义 class <类名>:     <其他语句> class <类名>(父类名):     <其他语句> >...
    99+
    2023-01-31
    小结 面向对象 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作