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

Python面向对象编程Day 26部分

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

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

摘要

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

大数据类型:整型、字符串、列表、元组、字典

多态概念指出了对象如何通过他们共同的属性和动作来操作和访问,而不需考虑他们具体的类、多态表明了动态(又名:运行时)绑定的存在,允许重载及运行时类型确定和验证。多态是继承的改变和扩展的实现机制,即调用不同的类实例化得对象下的相同方法,实现的过程不一样。

python中的标准类型就是多态概念的一个良好示范)

本质是要明确的区分内外。Python约定(并不是实际的限制)单下划线开头的变量为隐藏变量。python会给双下划线开头的变量重命名(前加上'_ClassName')

  第一个层面的封装:类就是麻袋,这本身就是一种封装

  第二个层面的封装:类中定义私有的,只在类的内部使用,外部无法访问(停留在约定层面)

  第三个层面的封装(真正的封装):明确区分内外(内部可以直接使用,外部则不能),内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑提供一个访问接口(访问函数 )给外部使用

 

  通过继承+多态在语言层面支持了归一化设计。不用面向对象的语言即class一样可以做归一化(比如泛文件概念),一样可以封装,只是使用面向对象语言可以直接用语言元素显示声明而已。

 

主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(也叫自省)。

  四个可以实现自省的函数(适用于类和对象):

    hasattr(object,name,default=None)判断object中有没有一个name字符串对应的方法或属性,没有打印False

    getattr(object,name,default=None)没有则报错,如果default=None位置处写一个错误提示字符串,就不会报错了,而是输出这个字符串

    setattr(object,key(字符串形式),value )添加或修改

    delattr(object,key(字符串形式))相当于 del object.key

底层是基于反射去做的。

import dic

 

m=__import__('dic')  #字符串形式导入模块,只能导入最顶级模块

print(m)  #module 'm1'

 

module_t=__import__('m1.t')  #实际引入的是m1

module_t.t  #是在调用m1文件夹中的t文件

 

from m1.t import *  #标红是因为没在环境变量中  导入不了函数名以下划线开头的函数

 

import importlib

m=importlib.import_module('m1.t')  #这回直接定位到t

print(m)  #module 'm1.t'

m.test1()调用t文件下的test1函数

 

  双下划线开头(内置方法)的attr方法

  属性不存在时触发__getattr__函数(最重要,用的比较多)

  删除一个对象的属性时会触发__delattr__函数

  __setattr__(self,key,value)设置时触发  函数内self.key=value这样会触发无限递归  应该这样设置self.__dict__[key]=value操作底层字典(del 什么.什么也会导致无限递归)  最后执行设属性操作可通过 f=函数名(参数)  f.key=value这样设定

 

  print(函数名.__dict__)和print(dir(函数名))都是用来打印属性方法的,但是后者更全面

 1 class Foo:
 2     def __init__(self,name):
 3         self.name=name
 4     def __getattr__(self, item):
 5         print('你找的属性【%s】不存在' %item)
 6     def __setattr__(self, k,v):
 7         print('执行setattr',k,v)
 8         if type(v) is str:
 9             print('开始设置')
10             # self.k=v #触发__setattr__
11             self.__dict__[k]=v.upper()
12         else:
13             print('必须是字符串类型')
14     def __delattr__(self, item):
15         print('不允许删除属性【%s】' %item)
16         # print('执行delattr',item)
17         # del self.item
18         # self.__dict__.pop(item)
19 
20 f1=Foo('alex')#触发__setattr__
21 # f1.age=18 #触发__setattr__
22 # print(f1.__dict__)
23 # print(f1.name)
24 # print(f1.age)
25 # print(f1.gender)
26 # print(f1.slary)
27 print(f1.__dict__)
28 del f1.name
29 print(f1.__dict__)

输出

执行setattr name alex
开始设置
{'name': 'ALEX'}
不允许删除属性【name】
{'name': 'ALEX'}

 

授权是包装的一个特性,包装一个类型通常是对已存在的类型的一些定制,修改或删除原有产品功能,其它的保持原样。授权的过程即所有更新的功能都是由新类的某部分处理,但已存在的功能就授权给对象的默认属性。

包装通过继承加派生实现。

实现授权的关键点就是覆盖__getattr__方法。 

 

str()工厂函数 str一个类

 

 包装标准类型

 1 class List(list):
 2     def append(self, p_object):
 3         if type(p_object) is str:
 4             # self.append(p_object)
 5             super().append(p_object)
 6         else:
 7             print('只能添加字符串类型')
 8 
 9     def show_midlle(self):
10         mid_index=int(len(self)/2)
11         return self[mid_index]
12 
13 
14 # l2=list('hell oworld')
15 # print(l2,type(l2))
16 
17 l1=List('helloworld')
18 # print(l1,type(l1))
19 # print(l1.show_midlle())
20 l1.append(1111111111111111111111)
21 l1.append('SB')
22 print(l1)

输出

只能添加字符串类型
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', 'SB']

 

组合的方式完成授权

 1 import time
 2 class FileHandle:
 3     def __init__(self,filename,mode='r',encoding='utf-8'):
 4         # self.filename=filename
 5         self.file=open(filename,mode,encoding=encoding)
 6         self.mode=mode
 7         self.encoding=encoding
 8     def write(self,line):
 9         print('------------>',line)
10         t=time.strftime('%Y-%m-%d %X')
11         self.file.write('%s %s' %(t,line))
12 
13     def __getattr__(self, item):
14         # print(item,type(item))
15         # self.file.read
16         return getattr(self.file,item)
17 
18 f1=FileHandle('a.txt','w+')
19 # print(f1.file)
20 # print(f1.__dict__)
21 # print('==>',f1.read) #触发__getattr__
22 # print(f1.write)
23 f1.write('1111111111111111\n')
24 f1.write('cpu负载过高\n')
25 f1.write('内存剩余不足\n')
26 f1.write('硬盘剩余不足\n')
27 # f1.seek(0)
28 # print('--->',f1.read())

 

--结束END--

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

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

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

猜你喜欢
  • Python面向对象编程Day 26部分
    五大数据类型:整型、字符串、列表、元组、字典 多态概念指出了对象如何通过他们共同的属性和动作来操作和访问,而不需考虑他们具体的类、多态表明了动态(又名:运行时)绑定的存在,允许重载及运行时类型确定和验证。多态是继承的改变和扩展的实现机制...
    99+
    2023-01-30
    面向对象 Python Day
  • 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 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
  • 第26天面向对象编程之组合,多态,封装
    组合 人生三问: 什么是组合  组合就是将一个对象A定义为另一个对象B的属性。从而使得B不仅能够访问自己的属性,还会具备A的属性,就像是把对象A和对象B组合到一块一样。 为什么要用组合  和继承一样为了减少类与类之间的代码冗余。  问题...
    99+
    2023-01-30
    组合 面向对象 多态
  • 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
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作