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

Python面向对象编程Day 25部分

面向对象PythonDay 2023-01-30 22:01:38 492人浏览 独家记忆

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

摘要

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

实例化的时候python会自动把实例本身传给self

__dict__ 查看属性

类调用的时候不会自动传递参数

  s1.tell_info()

  School.tell_info(s1)

增 .key=什么;减 del;改 =;查 .调用

 

类属性包括数据属性和函数属性

实例属性只有数据属性

面向对象编程三大特性:多态、继承、封装

  说的就是数据属性,点的方式调用的就是属性,把函数封装成数据属性,使得外部在调用的时候感觉不到内部的逻辑。既可以访问实例属性还可以访问类属性

  函数前加@property调用的时候不用加括号,看起来就像数据属性(例如r1.cal_area,如果函数内部是return,则需要print才能打印)

  函数开头加@claSSMethod跟类绑定,变成一个专门跟类有关的方法(取消和实例的捆绑),函数的参数是cls即类名。可以访问类的数据属性和函数属性,但不能访问实例的属性。

  类调用类方法的时候传不传参数?有自动传递参数。

  类方法用来访问类属性。

1 class Foo:
2     x=1
3     # @classmethod
4     def test(cls):
5         print('aaa')
6 f1=Foo()
7 f1.test()
8 Foo.test()

输出

aaa
Traceback (most recent call last):
File "F:/PyCharmProjects/Python_s3/复习练习/practice.py", line 122, in <module>
Foo.test()
TypeError: test() missing 1 required positional argument: 'cls'

(如果第八行传入参数Foo,或者第三行去掉注释打印结果为两行aaa,不会报异常)

 

  函数前加@staticmethod,跟类和实例无关的操作。名义上的归属类管理,不能使用类变量和实例变量,是类的工具包。不能访问类和实例属性。

  

如果在class里单独写个函数,前面啥也不加,实例是无法调用它的,这样写毫无意义。

大类由一个个小类拼接而成。类跟类之间没共同点,但是有关联,用组合实现。

 1 class School:
 2     def __init__(self,name,addr):
 3         self.name=name
 4         self.addr=addr
 5 
 6     def zhao_sheng(self):
 7         print('%s 正在招生' %self.name)
 8 
 9 class Course:
10     def __init__(self,name,price,period,school):
11         self.name=name
12         self.price=price
13         self.period=period
14         self.school=school
15 
16 
17 
18 s1=School('oldboy','北京')
19 s2=School('oldboy','南京')
20 s3=School('oldboy','东京')
21 
22 # c1=Course('linux',10,'1h','oldboy 北京')
23 c1=Course('linux',10,'1h',s1)
24 
25 print(c1.__dict__)
26 print(c1.school.name)
27 print(s1)

输出

{'name': 'linux', 'price': 10, 'period': '1h', 'school': <__main__.School object at 0x0000021A650C99E8>}
oldboy
<__main__.School object at 0x0000021A650C99E8>

 

类的继承有两层意义:1.改变 2.扩展

什么时候用继承?当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好

而,当类显著不同,且较小的类是较大的类所需要的组件时,用组合比较好

 

 类名(参数)  #__init__中需要的参数

 

派生是衍生新的东西,继承就是延续之前的功能

 

继承具有两种含义:1.继承基类的方法,并且做出自己的改变或者扩展(减少代码重用);2.声明某子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法。

(第一种含义意义并不大,甚至通常是有害的,因为它使得子类和基类出现强耦合,而程序倡导解耦合;而第二种含义的意义非常重要,叫做接口继承,接口就是方法(一个具体的函数),子类必须实现父类的方法)

 

Python的类可以继承多个类,Java和C#则只能继承一个类。

 

经典类继承(基类没有任何继承关系,不继承object)(python2):深度优先

新式类继承(python3默认;python2):广度优先

__mro__生成解析顺序元组(经典类没这个方法)  最后一步找的object说明再往上没父类了

  MRO遵循三条准则:1.子类会先于父类被检查;2.多个父类会根据他们在MRO元组中的顺序被检查;3.若下一

           个类存在两个合法的选择,选择第一个父类 

 

 

真正的接口继承要import abc  基类参数写metaclass=abc.ABCMeta  @abc.abstractmethod  确保子类必须实现接口

 

归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。

好处在于:

  1. 归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

  2. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合

 

子类中如何调用父类的方法?(不好用,扩展性差,父类变更之后子类需要变更的地方太多)__init__:在子类的__init__中写父类名.__init__(包括self在内参数)  方法:vehicle.run(self)

  实例化或对象调用方法时会动到self

super().方法(参数,不用传self)不用写父类名了

 

选课系统

 1 import pickle    #数据传送模块
 2 import hashlib    #产生哈希值标识身份
 3 import time
 4 def create_md5():
 5     m = hashlib.md5()
 6     m.update(str(time.time()).encode('utf-8'))
 7     return  m.hexdigest()
 8 
 9 class Base:
10     def save(self):
11         with open('school.db','wb') as f:
12             pickle.dump(self,f)
13 
14 class School(Base):
15     def __init__(self,name,addr):
16         self.id=create_md5()
17         self.name=name
18         self.addr=addr
19 
20 class Course(Base):
21     def __init__(self,name,price,period,school):
22         self.id=create_md5()
23         self.name=name
24         self.price=price
25         self.period=period
26         self.school=school
27 
28 school_obj = pickle.load(open('school.db', 'rb'))
29 print(school_obj.name,school_obj.addr)
30 # s1=School('oldboy','北京')
31 # s1.save()    

--结束END--

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

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

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

猜你喜欢
  • Python面向对象编程Day 25部分
    实例化的时候python会自动把实例本身传给self __dict__ 查看属性 类调用的时候不会自动传递参数   s1.tell_info()   School.tell_info(s1) 增 .key=什么;减 del;改 =;查 ....
    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 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开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作