pytion3--class一个更实际的例子
class一个更实际的例子
到目前为止,我们所看的大多数例子都是人为创造而且是独立完备的,其目的是为了帮助你把注意力集中在基础知识上。然而,本章的结尾是一个较大的例子,把我们所学的大多数概念都聚合在这里。这个例子几乎是需要自行研究的练习题:试着看这个例子的程序代码,来了解方法调用是如何解析的。
简而言之,下列模块person.Py定义了三个类:
- GeneriCOisplay是混合类,提供了通用的__str__方法.对任何继承了它的类来说,这个方法会返回字符串,给出创建该实例的类的名称,以及实例内每个属性的“name=valu扩对。它使用dict属性命名空间字典替代了类实例中每个属性创建的“name=valu矿配对列表,并且使用实例内置的class中的内置__name__来确认类的名称.因为print语句会触发_str__,这个类的结果,会替这个类所衍生的所有实例都显示这个专有化打印格式。这是通用的工具。
- person会记录人们的一般信.息,提供两个处理方法来使用并修改实例对象的状态信息。此外,也会从其超类继承专有的打印格式逻辑。人物对象有两个属性和两个由这个类管理的方法。
- Employee是对person定制的类,继承了读取姓氏和专有的打印格式方法。但是也增加了一个方法来实现加薪,并重新定义生日运算从而进行了定制(显然,员工要比其他人都老得快)。注意:超类构造方法如何手动启用的。我们需要执行上层的超类版本,来添加名字和年龄。
当你研究这个模块的代码时,你会看见每个实例都有自己的状态信.息。注意继承是如何应用于混合并对行为定进行制,以及运算符重载是如何用于对实例进行初始化和打印实例的。
要测试此程序代码时,我们可以在交互模式下导入这个模块并创建实例。例如,下面是对Person类的运用。建立实例时会触发__init__,接着调用一些方法,来使用或修改实例状态(属性),并在打印实例时,运行继承的的Str从而打印了所有的属性。
最后,下面是文件自我mll试逻辑(位于最后的代码,就用__name__测试下面的代码)的输出,它创建一个人物和一个员工,并对其进行修改。就像往常一样,当文件以顶层脚本执行时,这个自我测试程序代码才会运行,当作为库模块导入时则不会。注意员工是如何继承打印格式和姓氏提取的,有更多的状态信息,还有另一个方法用来加薪,而且可以执行专有化版本的生日方法(过生日老两岁)。
跟踪这个例子中的代码,从而了解这些输出所反映的方法调用。这个例子涵盖了Python
中00P机制的大多数概念。
现在,已经了解了Python类,可能意识到,这里所用的类几乎就像是函数包,嵌套附加在实例上的属性的内置对象,作为状态信息,并对其进行管理。例如,当lastName方法切割并进行索引运算时,只是在对类所管理的对象进行内置的字符串和列表处理运算。运算符重载和继承(在类树中自动查找属性)是蓝图中主要的00P工具。最后,这可以让类树底端的Employee获得得不少“免费”的行为,而这也是OOP内含主要概念。
#!/usr/bin/env python
# -*- coding:utf-8 -*- class GenericDisplay:
def gatherAttrs(self):
attrs = "\n"
for key in self.__dict__:
attrs += '\t%s=%s\n' % (key, self.__dict__[key])
return attrs
def __str__(self):
return '<%s: %s>' % (self.__class__.__name__, self.gatherAttrs()) class Person(GenericDisplay):
def __init__(self, name, age):
self.name = name
self.age = age
def lastName(self):
return self.name.split()[-1]
def birthDay(self):
self.age += 1 class Employee(Person):
def __init__(self, name, age, job=None, pay=0):
Person.__init__(self, name, age)
self.job = job
self.pay = pay
def birthDay(self):
self.age += 2
def giveRaise(self, percent):
self.pay *= (1.0 + percent) if __name__ == '__main__':
bob = Person('Bob Smith', 40)
print(bob)
print("--------------------------------")
print(bob.lastName())
bob.birthDay()
print(bob)
print("--------------------------------")
sue = Employee('Sue jones', 44, job='dev', pay=100000)
print(sue)
print(sue.lastName())
sue.giveRaise(0.10)
print(sue)
运行结果:
<Person:
name=Bob Smith
age=40
>
--------------------------------
Smith
<Person:
name=Bob Smith
age=41
>
--------------------------------
<Employee:
name=Sue jones
age=44
job=dev
pay=100000
>
jones
<Employee:
name=Sue jones
age=44
job=dev
pay=110000.00000000001
>
pytion3--class一个更实际的例子的更多相关文章
- [python]python 遍历一个list 的小例子:
[python]python 遍历一个list 的小例子: mlist=["aaa","bbb","ccc"]for ss in enume ...
- Leetcode 496. 下一个更大元素 I
1.题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 ...
- 从程序到系统:建立一个更智能的世界——记Joseph Sifakis“21世纪的计算”大会主题演讲
Sifakis"21世纪的计算"大会主题演讲" title="从程序到系统:建立一个更智能的世界--记Joseph Sifakis"21世纪的计算&q ...
- 在字节跳动,一个更好的企业级SparkSQL Server这么做
SparkSQL是Spark生态系统中非常重要的组件.面向企业级服务时,SparkSQL存在易用性较差的问题,导致难满足日常的业务开发需求.本文将详细解读,如何通过构建SparkSQL服务器实现使用效 ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- COM是一个更好的C++
昨天看了<COM本质论>的第一章”COM是一个更好的C++”,觉得很有必要做一些笔记,于是整理成这篇文章,我相信你值得拥有. 这篇文章主要讲的内容是:一个实现了快速查找功能的类FastSt ...
- java 多线程——一个定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
随机推荐
- python中的random
random.randint(a,b) 用于生成一个指定范围内的整数,a为下限,b为上限,生成的随机整数a<=n<=b;若a=b,则n=a:若a>b,报错 import ran ...
- Linux系统日志分析
Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 / ...
- win10 KMS激活
运行 输入以管理员权限输入CMD 如果已安装密匙先卸载,没有的话可以跳过 slmgr -upk 卸载密匙命令 输入对应版密匙以及KMS地址激活 1.键入命令:slmgr -ipk XXXXX-XXXX ...
- Python XML 解析
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并 ...
- js 获取当前年月日时分秒星期
$("#aa").click(function () { var date = new Date(); this.year = date.getFullYear(); this.m ...
- no pointer in java
Why there are no pointers in Java? In Java there are references instead of pointers. These reference ...
- idea中pom.xml没有工作 IDEA中maven项目pom.xml依赖不生效解决
问题: 今天在web项目中需要引入poi相关jar包.查看之下才发现pom.xml中的依赖虽然已经下载到了本地仓库 repository,但是却没有加入到项目路径的 Extenal Libraries ...
- springboot 内置tomcat maxPostSizs 无法设置
++++++++++++++++++ RT +++++++++++++++++ 如下代码方可解决: /** * tomcat配置类 * 解决post数据体大于2048kb无法接收问题 * 解决tomc ...
- c++文件偏移
#include <iostream> #include <fstream> #include <cassert> using namespace std; int ...
- Silverlight日记:字符串装换成Path对象
一,需要动态绑定Path <UserControl x:Class="Secom.Emx2.SL.Common.Controls.EleSafe.Ele.Line" xmln ...