iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >课时39:类与对象:拾遗
  • 429
分享到

课时39:类与对象:拾遗

课时对象 2023-01-30 22:01:58 429人浏览 八月长安

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

摘要

目录:   一、组合   二、类、类对象和实例对象   三、到底什么是绑定   四、课时39课后习题及答案   *********** 一、组合 ***********  现在要求定义一个类,叫水池,水池里要有乌龟和鱼。 在python里

目录:

  一、组合

  二、类、类对象和实例对象

  三、到底什么是绑定

  四、课时39课后习题及答案

 

***********

一、组合

***********

 现在要求定义一个类,叫水池,水池里要有乌龟和鱼。

python里其实很简单,直接把需要的类放进去实例化就可以了,这就叫组合:

#p11_3.py
class Turtle:
      def __init__(self, x):
            self.num = x

class Fish:
      def __init__(self, x):
            self.num = x

class Pool:
      def __init__(self, x, y):
            self.turtle = Turtle(x)
            self.fish = Fish(y)
      def print_num(self):
            print("水池里总共有乌龟 %d 只,小鱼 %d 条!" % (self.turtle.num, self.fish.num))
>>> #先运行p11_3.py
>>> pool = Pool(1,10)
>>> pool.print_num()
水池里总共有乌龟 1 只,小鱼 10 条!

Python的特性其实还支持另外一种很流行的编程模式:Mixin.【扩展阅读】Mixin编程机制(https://fishc.com.cn/forum.PHP?mod=viewthread&tid=48888&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403)

 

*******************************

二、类、类对象和实例对象

*******************************

 先来分析一段代码:

>>> class C:
    count = 0

    
>>> a = C()
>>> b = C()
>>> c = C()
>>> print(a.count,b.count,c.count)
0 0 0
>>> c.count += 10
>>> print(a.count,b.count,c.count)
0 0 10
>>> C.count += 10
>>> print(a.count,b.count,c.count)
10 10 10
>>> C.count += 100
>>> print(a.count,b.count,c.count)
110 110 10

从上面的例子可以看出,对实例对象c的count属性进行赋值后,就相当于覆盖了类对象C的count属性。如图所示,如果没有赋值覆盖,那么引用的是类对象的count属性。

 

需要注意的是,类中定义的属性是静态变量,也就是相当于C语言中加上static关键字声明变量,类的属性是与类对象进行绑定,并不会依赖任何它的实例对象。

另外,如果属性的名字和方法名相同,属性会覆盖方法:

>>> class C:
    def x(self):
        print('Xman')

        
>>> c = C()
>>> c.x()
Xman
>>> c.x = 1
>>> c.x
1
>>> c.x()
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    c.x()
TypeError: 'int' object is not callable

为了避免名字上的冲突,大家应该遵守一些约定俗成的规定:

(1)类的定义要“少吃多餐”,不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展。

(2)用 不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法。

 

***********************

三、到底什么是绑定

***********************

 Python严格要求方法需要用实例才能调用,这种限制其实就是Python所谓的绑定概念。前面也粗略地解释了一下绑定,但有可能你会这么尝试,然后发现也可以调用:

>>> class BB:
    def printBB():
        print("no zuo no die")


>>> BB.printBB()
no zuo no die

但是这样做有个问题,就是根据类的实例化后的对象根本无法调用里边的函数:

>>> bb = BB()
>>> bb.printBB()
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    bb.printBB()
TypeError: printBB() takes 0 positional arguments but 1 was given

实际上由于Python的绑定机制,这里自动把bb对象作为第一个参数传入,所以才会出先TypeError。

为了更好的理解,再深入的挖一挖:

>>> class CC:
    def setXY(self,x,y):
        self.x = x
        self.y = y
    def printXY(self):
        print(self.x,self.y)

>>> dd = CC()

可以使用_ _dict_ _查看对象所拥有的属性:

>>> dd.__dict__
{}
>>> CC.__dict__
mappingproxy({'__module__': '__main__', 'setXY': <function CC.setXY at 0x0000024E3998D400>, 'printXY': <function CC.printXY at 0x0000024E3998D620>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None})

_ _dict_ _属性是由一个字典组成,字典中仅有实例对象的属性,不现实类属性和特殊属性,键表示的是属性名,值表示属性相应的数据值。

>>> dd.setXY(4,5)
>>> dd.__dict__
{'x': 4, 'y': 5}

现在实例对象dd有了两个新属性,而且这两个属性仅属于实例对象的:

>>> CC.__dict__
mappingproxy({'__module__': '__main__', 'setXY': <function CC.setXY at 0x0000024E3998D400>, 'printXY': <function CC.printXY at 0x0000024E3998D620>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None})

为什么会这样呢?完全归功于self参数:当实例对象dd去调用setXY方法的时候,它传入的第一个参数是dd,那么self.x = 4,self.y = 5也就相当于dd.x = 4,dd.y = 5,所以你在实例对象,甚至类对象中都看不到x和y,因为这两个属性是只属于实例对象dd的。

接下来思考下:如果把类实例删除掉,实例对象dd还能否调用printXY方法?

>>> del CC
        答案是可以的:
>>> dd.printXY()
4 5

 

*******************************

四、课时39课后习题及答案

*******************************

 

 

--结束END--

本文标题: 课时39:类与对象:拾遗

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 课时39:类与对象:拾遗
    目录:   一、组合   二、类、类对象和实例对象   三、到底什么是绑定   四、课时39课后习题及答案   *********** 一、组合 ***********  现在要求定义一个类,叫水池,水池里要有乌龟和鱼。 在Python里...
    99+
    2023-01-30
    课时 对象
  • 课时38:类与对象:继承
    目录:  一、继承   二、调用未绑定的父类方法   三、使用super函数   四、多重继承   五、课时38课后习题及答案   现在需要扩展游戏,对鱼类进行细分,有金鱼(Goldfish)、三文鱼(Salmon)、鲤鱼(Carp),还...
    99+
    2023-01-30
    课时 对象
  • 课时37:类与对象:面向对象编程
    目录:   一、self是什么   二、Python的魔法方法   三、公有和私有   四、课时37课后习题及答案   ***************** 一、self是什么 ***************** 对象的方法都有一个self...
    99+
    2023-01-30
    课时 面向对象 对象
  • 课时36:类与对象:给大家介绍对象
    目录:   一、对象=属性+方法   二、课时36课后习题及答案   大家之前已经听说过封装的概念,把乱七八糟的数据扔进列表里面,这是一种封装,是数据层面的封装;把常用的代码段打包成一个函数,这也是一种封装,是语句层面的封装;本章学习的对...
    99+
    2023-01-30
    对象 给大家 课时
  • 课时40:类与对象:一些相关的BIF
    目录:    一、一些相关的BIF    二、、课时40课后习题及答案   **********************  一、一些相关的BIF ********************** 1、issubclass(class,clas...
    99+
    2023-01-30
    课时 对象 BIF
  • 类与对象
    目录 类与对象 现实世界中定义类和对象 定义对象 定义对象 程序中定义类和对象 ...
    99+
    2023-01-31
    对象
  • 类与对象2
    1. 重写类方法 第一步:在类的外部写一个函数; 第二步:把这个新函数的名字赋值给类.原始函数 (注意:这里的赋值是在替换方法,并不是调用函数,所以【不要加上括号】—— 写成类.原始函数() = 新函数()是错误的。) 语法格式如下: ...
    99+
    2023-01-31
    对象
  • 3.类与对象
            Java 系统提供的类库也称为Java API,它是系统提供的已实现的标准类的集合。在J2SE中我们可以将Java API的包主要分为3部分:“java.*”包,“javax.*”包,“org.*”包。         其中...
    99+
    2023-01-31
    对象
  • Java 类与对象详细
    目录1.类2.对象3.练习 4.练习答案 前言: 早期的Java语言,是面对过程的语言(面向过程指把一个场景分割成一个个的步骤研究),如今的Java已经是面对对象的语言(面向对象指把...
    99+
    2024-04-02
  • python中面向对象_类_对象的概念与
    1. 面向对象的概念,面向对象是一种编程思想。 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型     2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤。 面向对象关注的是谁能完成工作。 面...
    99+
    2023-01-30
    面向对象 对象 概念
  • JS的时间对象与引用类型是什么
    这篇文章主要讲解了“JS的时间对象与引用类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的时间对象与引用类型是什么”吧!   基础类型:Str...
    99+
    2024-04-02
  • Java类与对象详解(2)
      this引用 为什么要有this引用 先来看一个日期类的例子: ​public class Date { public int year; public int month; public int day; /...
    99+
    2023-09-01
    java 开发语言
  • Java类与对象详解(3)
    目录 封装 封装的概念 访问限定符 封装扩展之包 包的概念 导入包中的类 自定义包 基本规则 包的访问权限控制举例 常见的包 static 成员 static 修饰成员变量 static修饰成员方法  static 成员变量的初始化 代码...
    99+
    2023-08-31
    java 开发语言
  • C++类与对象实例分析
    这篇“C++类与对象实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++类与对象实例分析”文章吧。运算符重载C++语...
    99+
    2023-06-30
  • java类与对象如何运行
    Java类与对象的运行是通过创建对象实例来实现的。具体步骤如下:1. 定义类:首先需要定义一个类,类是一种数据类型,用于描述对象的属...
    99+
    2023-09-16
    java
  • C++全面精通类与对象
    目录运算符重载运算符复用前置后置运算符constC++ 的IO流初始化列表explicit 关键字运算符重载 C++语法设计很巧妙,比如运算符重载一个 > bool opera...
    99+
    2024-04-02
  • JS中时间对象与引用类型的示例分析
    这篇文章将为大家详细讲解有关JS中时间对象与引用类型的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基础类型有哪些?复杂类型有哪些?有什么特征?基础类型:Stri...
    99+
    2024-04-02
  • 类与对象的绑定方法
    目录 类与对象的绑定方法 类的绑定对象 对象的绑定方法 class OldboyStudent: school ...
    99+
    2023-01-31
    绑定 对象 方法
  • C++类与对象之日期类的实现
    目录1. 实现前的铺垫2. 日期类的实现2.1 日期+=天数2.2 日期-=天数2.3 日期-天数2.4 日期+天数2.5 前置++2.6 后置++2.7 前置–2.8 后置–2.9...
    99+
    2024-04-02
  • 掌握 Java 类与对象:面向对象设计的秘诀
    前言 面向对象编程 (OOP) 是一种强大的编程范例,它通过将程序组织为对象来解决复杂问题。在 Java 中,类和对象是 OOP 的核心概念。类充当蓝图,用于创建特定类型的数据和行为的对象。 Java 类 Java 类是一组相关数据的集合...
    99+
    2024-03-09
    Java 类、Java 对象、面向对象编程、OOP 设计
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作