zoukankan      html  css  js  c++  java
  • 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 = "
    "
            for key in self.__dict__:
                attrs += '	%s=%s
    ' % (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
    >
    
  • 相关阅读:
    HashMap和Hashtable及HashSet的区别
    Android获取系统的时间
    Android的布局属性
    ListView 在代码里设置margin
    如何用Vue自己实现一个message提示插件
    JS获取最近三个月日期范围
    css实现表单label文字两端对齐
    my utils
    Vue 路由&组件懒加载(按需加载)
    C# 通过window消息控制指定控件的scroll滚动
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7307824.html
Copyright © 2011-2022 走看看