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
>
时间: 2024-10-10 05:16:34

pytion3--class一个更实际的例子的相关文章

【摘】50个jQuery代码段帮助你成为一个更好的JavaScript开发者

今 天的帖子会给你们展示50个jQuery代码片段,这些代码能够给你的JavaScript项目提供帮助.其中的一些代码段是从jQuery1.4.2才 开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助你又快又好地把事情完成.这些都是我尽量记住的有着最佳性能的代码段,因此如果你发现你任 何可以做得更好的地方的话,欢迎把你的版本粘贴在评论中!我希望你在这一文章中能找到有帮助的东西. 1.     如何创建嵌套的过滤器: //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器

建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)

add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所以在说明方法演进时有些罗嗦,至少方法1是没有必要说的. 本文介绍了如何给QuerySet类增加方法属性.作者写本文时,Django1.7还在开发中,没有发布.在Django1.7版本中提供了这个功能, 见https://docs.djangoproject.com/en/dev/releases/1

COM是一个更好的C++

昨天看了<COM本质论>的第一章"COM是一个更好的C++",觉得很有必要做一些笔记,于是整理成这篇文章,我相信你值得拥有. 这篇文章主要讲的内容是:一个实现了快速查找功能的类FastString,在一个小小的需求之后,慢慢的演变成一个COM组件的过程. 类FastString实现了一个快速查找字符串的功能,快到时间复杂度是O(1),我们先不管作者是怎么实现的,估计是通过空间换时间.由于这个类查找字符串很快,于是作者就把这个类当做一个产品,以源码的方式卖给需要的厂商,厂商用

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

一个简单的KVO例子

一个简单的KVO例子. 两个界面,第一个界面显示名字和配偶(spouse)名字,第二个界面显示修改名字和配偶名字,返回时,将看到第一个界面的名字显示发生改变. 首先定义一个person类作为model. #import <Foundation/Foundation.h> @interface Person : NSObject @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) NSString

《COM本质论》COM是一个更好的C++心得分享

昨天看了<COM本质论>的第一章"COM是一个更好的C++",认为非常有必要做一些笔记,于是整理成这篇文章.我相信你值得拥有. 这篇文章主要讲的内容是:一个实现了高速查找功能的类FastString,在一个小小的需求之后,慢慢的演变成一个COM组件的过程. 类FastString实现了一个高速查找字符串的功能.快到时间复杂度是O(1),我们先无论作者是怎么实现的,预计是通过空间换时间. 因为这个类查找字符串非常快,于是作者就把这个类当做一个产品,以源代码的方式卖给须要的厂商

Java一个简单的死锁例子

内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的.然后如果这段时间线程B拿到锁Y,也sleep()一段时间的话,那么等到两个线程都醒过来的话,那么将互相等待对方释放锁资源而僵持下去,陷入死锁.flag的作用就是让A和B获得不同的锁. public class TestDeadLock { public void run() { MyThread mt = new MyThread(); ne

编写一个简单的jdbc例子程序

1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class Base { 10 11 public static void main(String[] args) th

在Ubuntu 12.04 中如何更换一个更快的软件源?

在ubuntu 下下载安装软件使用不同的镜像源速度差异非常大, 官方的那个比较慢,所以选择最快的最有效率.设置方法不一,网上教程比较常见的是自己手动去更改更新源列表,把特定版本的源列表直接复制到 /etc/apt/sources.list 文件中,但是有时候源文件会失效,而且不一定每次源文件都是跟自己的版本兼容的. 网上看到一个教程,方法很简单, 转载一下:(转自于IMCN) 在Ubuntu 12.04 中用户如何更换一个更快的软件源?