一年前就打算学Python了,折腾来折腾去也一直没有用熟练,主要是类那一块不熟,昨天用Python写了几个网络编程的示例,感觉一下子迈进了很多。这几天把学习Python的笔记整理一下,内容尽量简洁。

 

 

下面这个例子演示类的基本使用:

# coding:utf-8

class Test():
s = '这是一个静态变量'
def __init__(self):
print '这里是构造函数'
self.a = 1
self.b = 12 def __del__(self):
print '这里是析构函数' def foo(self):
print '普通成员函数' @staticmethod
def bar():
print '类的静态函数' if __name__ == '__main__':
t = Test()
t.foo()
Test.bar()
print t.__class__
print Test.__bases__
print Test.s

很多书上很啰嗦的介绍Python的类,但是很多Python学习者本身已经具备了C++或者Java的基础,所以我直接尝试写了这个一个demo。

在Python中,构造函数使用了__init__,析构函数则使用了__del__。

在C++中,类的成员变量和函数都是编译之前就确定了,而Python可以再运行期确定。

上例中的s相当于静态变量,整个类共同拥有。

__init__函数中的self.a属于普通成员变量。如果你在某一个函数中使用了

self.c = 'foo'

之类的语句,意味着你在这一行为该对象添加了一个数据成员。

但是这里注意,只有运行这一行之后,对象的数据成员才添加了c。所以,Python的成员变量是可以在运行过程中增减的。

 

 

 

再看第二个示例,关于继承和组合的:

# coding:utf-8

class Base():
def __init__(self, a, b):
print 'Base construct.'
self.a = a;
self.b = b;
self.t = Other() def __del__(self):
print 'Base destroy.' def foo(self):
print 'a = %s b = %s' % (self.a, self.b) class Other():
def __init__(self):
print 'Other construct.' def __del__(self):
print 'Other destroy.' class Derived(Base):
def __init__(self, a, b):
Base.__init__(self, a, b)
print 'Derived construct.' def __del__(self):
Base.__del__(self)
print 'Derived destroy.' if __name__ == '__main__':
d = Derived("foo", "bar")
d.foo()
print d.__class__
print d.__class__.__bases__
print Derived.__bases__

Base是基类,Derived从Base中继承,同时Other类的一个对象是Derived的一个数据成员。

在本例中,注意,Derived的构造函数中,必须手工调用Base的构造函数,析构函数也是相同的用法。

 

最后一个例子,关于基类和派生类的函数覆盖问题:

# coding:utf-8

class Foo():
def test(self):
print 'test in Base.' class Bar(Foo):
def test(self):
print 'test in Derived.' if __name__ == '__main__':
b = Bar()
b.test()

我们运行程序,打印的是:

test in Derived.

发现调用的是派生类的版本。这说明派生类的test函数覆盖了基类的版本。

这里需要注意,与C++不同,这里的Bar中的test函数,即使改变了参数也无所谓,总之,只要函数与基类中的函数重名,那就构成了覆盖。

如果在Bar的test函数中想调用基类的版本,可以使用:

Foo.test(self)

完整的代码如下:

# coding:utf-8

class Foo():
def test(self):
print 'test in Base.' class Bar(Foo):
def test(self):
Foo.test(self)
print 'test in Derived.' if __name__ == '__main__':
b = Bar()
b.test()

 

完。

Python学习笔记(一)类和继承的使用的更多相关文章

  1. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  2. python学习笔记1-元类__metaclass__

    type 其实就是元类,type 是python 背后创建所有对象的元类   python 中的类的创建规则: 假设创建Foo 这个类 class Foo(Bar): def __init__(): ...

  3. Python学习笔记 - day7 - 类

    类 面向对象最重要的概念就是类(Class)和实例(Instance),比如球类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同.在Python中,定义类 ...

  4. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  5. Python 学习笔记15 类 - 继承

    我们在编程的过程中,并非都是要重头开始.比如其他人已经有现成的类,我们可以使用其他找人编写的类.术语称之为: 继承. 当一个类继承例外一个类时,它可以获得这个类的所有属性和方法:原有的类称之为 父类, ...

  6. Python学习笔记12—类

    典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...

  7. Python 学习笔记 - 10.类(Class) 1

    定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...

  8. python学习笔记(七) 类和pygame实现打飞机游戏

    python中类声明如下: class Student(object): def __init__(self, name, score): self.name = name self.score = ...

  9. Python学习笔记:类

    类可以将数据与函数封装起来,用一个例子解释,先定义一个类: class athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.n ...

  10. Python 学习笔记16 类 - 导入

    我们在编码的过程中,可能会给对象添加越来越多的功能,即使我们使用了继承,也不可避免的使文件越来越臃肿. 为了避免这种情况, Python允许将对象存储在模块中,并且可以在其他模块中进行导入. 其实这和 ...

随机推荐

  1. SD卡给MCU升级

    目 录1. 前言2. 初识BootLoader2.1 百度百科的BootLoader2.2 BootLoader的简单理解2.3 BootLoader的作用3. BootLoader预备知识3.1 复 ...

  2. 我们曾经心碎的C#之 第一章.我的第一个C#程序

    第一章.      C#入门 1.1        .NET与C#            001..NET是Microsoft.NET的简称,是基于Windows平台的一种技术            ...

  3. log4net配置,正在用

    <?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name= ...

  4. scandir函数详解

    scandir函数详解2009-10-30 10:51scandir函数:读取特定的目录数据表头文件:#include <dirent.h>定义函数:int scandir(const c ...

  5. Southern African 2001 框架折叠 (拓扑序列的应用)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398377.html 题目:考虑五个图片堆叠在一起,比如下面的9 * 8 的矩阵表示的是这些图片的边缘框. 现在上面的图片 ...

  6. hadoop之linux常用命令

    Linux的命令后面会有命令选项,有的选项还有选项值.选项的前面有短横线“-”,命令.选项.选项值之间使用空格隔开.有的命令没有选项,会有参数.选项是命令内置的功能,参数是用户提供的符合命令格式的内容 ...

  7. poj1743(后缀数组)

    poj1743 题意 给出一个数字序列(串),现在要去寻找一个满足下列条件的子串: 长度不小于 5 存在重复的子串(如果把一个子串的所有数字都加上或减去一个值,与另一子串的数字对应相同,我们称它们重复 ...

  8. spoj - Grass Planting(树链剖分模板题)

    Grass Planting 题意 给出一棵树,树有边权.每次给出节点 (u, v) ,有两种操作:1. 把 u 到 v 路径上所有边的权值加 1.2. 查询 u 到 v 的权值之和. 分析 如果这些 ...

  9. #422 Div2 D

    #422 Div2 D 题意 假设有 n 个人比赛,每次比赛进行分组,每组人数必须相同,如果一组有 x 人,则那一组要比赛 $ \frac{x * (x - 1)}{2}$次,最终一人获胜,其它人淘汰 ...

  10. Jmeter插件之PerfMon监控插件使用说明

    PerfMon是Jmeter用来监控系统资源的一款插件,可以用来监控系统的cpu.内存.I/O等性能指标. 首先是Jmeter的插件安装,需要先下载JMeter Plugins Manager这个插件 ...