python 教程 第九章、 类与面向对象

第九章、 类与面向对象
1)    类
基本类/超类/父类被导出类或子类继承。
Inheritance继承
Inheritance is based on attribute lookup in Python (in X.name expressions).
Polymorphism多态
In X.method, the meaning of method depends on the type (class) of X.
Encapsulation封装
Methods and operators implement behavior; data hiding is a convention by default.

class C1():
    def __init__(self, who):
        self.name = who
I1 = C1('bob')
print I1.name #bob 

2)    命名空间

X = 11              # Global (module) name/attribute (X, or manynames.X)
def f():
    print(X)        # Access global X (11)
def g():
    X = 22          # Local (function) variable (X, hides module X)
    print(X)
class C:
    X = 33          # Class attribute (C.X)
    def m(self):
        X = 44      # Local variable in method (X)
        self.X = 55 # Instance attribute (instance.X)

print(X)          # 11: module (manynames.X outside file)
f()               # 11: global
g()                   # 22: local
print(X)         # 11: module name unchanged
obj = C()         # Make instance
print(obj.X)      # 33: class name inherited by instance
obj.m()           # Attach attribute name X to instance now
print(obj.X)      # 55: instance
print(C.X)        # 33: class (a.k.a. obj.X if no X in instance)
#print(C.m.X)     # FAILS: only visible in method
#print(g.X)       # FAILS: only visible in function

3)    Self参数
指向对象本身

4)    __init__构造器
如果没有__init__,则需要自己定义并赋值

class C1():                # Make and link class C1
    def setname(self, who):      # Assign name: C1.setname
        self.name = who          # Self is either I1 or I2
I1 = C1()                        # Make two instances,

#没有__init__,实例就是个空的命名空间

I1.setname('bob')                # Sets I1.name to 'bob'
print(I1.name)                   # Prints 'bob'

构造器,创建时例时自动调用。

5)    继承搜索的方法
An inheritance search looks for an attribute first in the instance object, then in the class the instance was created from, then in all higher superclasses, progressing from the bottom to the top of the object tree, and from left to right (by default).

6)    一个例子

class AttrDisplay:
    def gatherAttrs(self):
        attrs = []
        for key in sorted(self.__dict__):
            attrs.append('%s=%s' % (key, getattr(self, key)))
        return ', '.join(attrs)
    def __str__(self):
        return '[%s: %s]' % (self.__class__.__name__, self.gatherAttrs())

class Person(AttrDisplay): #Making Instances
    def __init__(self, name, job=None, pay=0): # Add defaults
        self.name = name # Constructor takes 3 arguments
        self.job  = job  # Fill out fields when created
        self.pay  = pay  # self is the new instance object
    def lastName(self):     # Assumes last is last
        return self.name.split()[-1]
    def giveRaise(self, percent):   # Percent must be 0..1
        self.pay = int(self.pay * (1 + percent))

class Manager(Person):
    def __init__(self, name, pay):
        Person.__init__(self, name, 'mgr', pay)
    def giveRaise(self, percent, bonus=.10):
        Person.giveRaise(self, percent + bonus)

if __name__ == '__main__': # Allow this file to be imported as well as run/tested
    bob = Person('Bob Smith')
    sue = Person('Sue Jones', job='dev', pay=100000)
    print(bob)
    print(sue)
    print(bob.lastName(), sue.lastName())
    sue.giveRaise(.10)
    print(sue)
    tom = Manager('Tom Jones', 50000)
    tom.giveRaise(.10)
    print(tom.lastName())
    print(tom) 
时间: 2024-11-02 11:53:36

python 教程 第九章、 类与面向对象的相关文章

《易学Python》——第6章 类与面向对象编程 6.1 类是什么

第6章 类与面向对象编程 本章介绍如下内容: 一种看待类的更简单方式: 如何使用类来设计程序. 在本书前面,始终未涉及Python中组织程序的基本方式之一:类.类和面向对象编程通常被认为是一个庞大而吓人的主题,仅供真正的程序员用来编写程序,因此您可能认为,要正确地使用它们,需要大量的理论知识.没有比这种看法更离谱的了.在Python中,使用类和面向编程易如反掌. 在本章中,您将首先复习第2章为游戏Hunt the Wumpus编写的洞穴生成代码,并了解到使用类编写这些代码容易得多:然后,您将以此

C语言学习教程第九章-预处理(4)

2. 第二种形式: #ifndef 标识符 程序段1 #else 程序段2 #endif 与第一种形式的区别是将"ifdef"改为"ifndef".它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译.这与第一种形式的功能正相反. 3. 第三种形式: #if 常量表达式 程序段1 #else 程序段2 #endif 它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译.因此可以使程序在不

C语言学习教程第九章-预处理(1)

预处理 概述在前面各章中,已多次使用过以"#"号开头的预处理命令.如包含命令# include,宏定义命令# define等.在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分. 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能, 它由预处理程序负责完成.当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译. C语言提供了多种预处理功能,如

C语言学习教程第九章-预处理(3)

文件包含 文件包含是C预处理程序的另一个重要功能.文件包含命令行的一般形式为: #include"文件名" 在前面我们已多次用此命令包含过库函数的头文件.例如: #include"stdio.h"#include"math.h" 文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行, 从而把指定的文件和当前的源程序文件连成一个源文件.在程序设计中,文件包含是很有用的. 一个大的程序可以分为多个模块,由多个程序员分别编程. 有些公用的符号常

C语言学习教程第九章-预处理(2)

带参宏定义 C语言允许宏带有参数.在宏定义中的参数称为形式参数, 在宏调用中的参数称为实际参数.对带参数的宏,在调用中,不仅要宏展开, 而且要用实参去代换形参. 带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参.带参宏调用的一般形式为: 宏名(实参表): 例如: #define M(y) y*y+3*y /*宏定义*/:k=M(5); /*宏调用*/: 在宏调用时,用实参5去代替形参y, 经预处理宏展开后的语句为: k=5*5+3*5#define MAX

在Python中使用元类的教程

  这篇文章主要介绍了在Python中使用元类的教程,是Python当中的基础知识,代码基于Python2.x版本,需要的朋友可以参考下 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: ? 1 2 3 class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Py

Python类及面向对象编程【转】

Python类及面向对象编程 类是用来创建数据结构和新类型对象的主要机制.本章的主题就是类,面向对象编程和设计不是本章的重点.本章假定你具有数据结构的背景知识及一定的面向对象的编程经验(其它面向对象的语言,比如java,c++).(参见第三章,类型和对象 了解对象这个术语及其内部实现的附加信息) WeiZhong补充: 这本书出版于2001年,虽然Python有极佳的向下兼容性,但我们应该学习最新的知识.本章很多地方已经明显过时,为了保证大家学到新的知识并维持这本书的完整性,我会在必要的地方说明

简明Python教程学习笔记_6_面向对象编程

简介 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的 实例 .这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象). 类(Class)::用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象:          通过类定义的数据结构实例.对象包括两个数据成员(类变量和实例变量)和方法. 实例化:      创建一个类的实例,类的具体对象.方法:          类中定义的函数. (方法和函数在

Python教程专题

可爱的Python: [anygui]项目预览 可爱的Python: 用于PalmOS的Python 可爱的Python: 用基于生成器的状态机和协同程序增加效率 可爱的Python: 用Python生成器实现"轻便线程" 可爱的Python: 使用Spark模块解析 可爱的Python: 使用SimpleParse模块进行解析 可爱的Python: 迭代器和简单生成器 可爱的Python: pydoc和distutils模块 可爱的Python: Numerical Python 可