在面向对象的语言中,类是最重要的一环,python自然拥有类这个机制。python的类机制,与C++,java的区别不是很大,类的大多数的重要特性都被沿用了,一样可以多态,抽象,封装;

python3作用域:

在介绍类之前,首先介绍下一下关于python作用域的规则;

1.命名空间:

是从命名到对象的映射。当前命名空间主要是通过 Python 字典实现的,不过通常不关心具体的实现方式(除非出于性能考虑);

以下有一些命名空间的例子:

内置命名(像 abs() 这样的函数,以及内置异常名)集,模块中的全局命名,函数调用中的局部命名。某种意义上讲对象的属性集也是一个命名空间。

关于命名空间需要了解的一件很重要的事就是不同命名空间中的命名没有任何联系,例如两个不同的模块可能都会定义一个名为 maximize 的函数而不会发生混淆--用户必须以模块名为前缀来引用它们。比如:math中有sin函数,可以通过math.sin调用;

2.作用域:

就是一个 Python 程序可以直接访问命名空间的正文区域。 这里的 直接访问 意思是一个对名称的错误引用会尝试在命名空间内查找。

一个例子:



def scope_test():

    def do_local():

        spam = "local spam"#局部变量

    def do_nonlocal():

        nonlocal spam

        spam = "nonlocal spam"#域变量,在整个函数域有效。

    def do_global():

        global spam

        spam = "global spam"#

    spam = "test spam"#全局变量,此处在函数域外有效;

    do_local()

    print("After local assignment:", spam)

    do_nonlocal()

    print("After nonlocal assignment:", spam)

    do_global()

    print("After global assignment:", spam)

scope_test()

print("In global scope:", spam)#全局变量作用域

##输出:

After local assignment: test spam

After nonlocal assignment: nonlocal spam

After global assignment: nonlocal spam

In global scope: global spam

类定义语法

类定义形式:


class className(superClass): <statement 1> ..... <statement N>

类定义就像函数定义一样,要先执行才能生效。习惯上statement语句是函数定义,不过其他语句也可以。

进入类定义部分后会创建出一个新的命名空间,作为局部作用域,因此所有的赋值成为这个新命名空间的局部变量,特别时函数定义在此处绑定了新的名字

类定义完成时,就创建了一个类对象。也就是类名;

类对像:

类对象支持两种操作:属性应用和实例化.

属性应用使用:类名.属性;例如类定义如下:


class Myclass: "一个简单的类用于属性介绍" num=123 def fun(self): return 'hello world'

那么我可以Myclass.num和Myclass.fun是有效的属性引用;分别返回一个整数,和一个方法对象;

类定义的实例化:类的实例话使用函数符号 :类名();

例如:x=Myclass()

以上创建了一个新的类的实例,并将该对象赋值给了变量x。此去没有初始化;

很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 init() 的特殊方法,像下面这样:


def __init__(self): self.data = []

类定义了 init() 方法的话,类的实例化操作会自动为新创建的类实例调用__init__() 方法。所以在下例中,可以这样创建一个新的实例:

x = MyClass()

当 然 , 出 于 弹 性 的 需 要 , init() 方 法 可 以 有 参 数 。 事 实 上 , 参 数 通 过__init__() 传递到类的实例化操作上。

实例对象:

实例对象就是用来操作类的属性引用;有两种引用:数据和方法

数据:和java中的成员类似,其实就是变量;和局部变量一样,数据属性不需要声明,第一次使用他们时就会生成;

比如:


x=Myclass() #Myclass类中没有声明,可以直接使用; x.counter=1

方法:方法是属于一个类的函数,方法引用为:x.fun();

也可以将方法引用赋值给变量这与函数赋值是一样的;

xf=x.fun()#注意self参数,是对象实例化作为第一个参数传给变量的,不需要显示调用;

实例属性和类属性

1实例属性介绍:

给实例绑定属性的方法是通过实例变量,或者通过self变量:


class Student(object): def __init__(self, name): self.name = name s = Student('peace') s.score =40

name和score都是实例属性;

2类属性:

可以直接在class中定义属性,这种属性是类属性,归类所有:


class student: name="peace"

name就是类属性,类的所有实例都可以访问到,并且是指向同一个对象;

继承:

没有继承就没有类,而python类的定义如下:



class className(superClass):

       <statement 1>

       .....

        <statement N>

##其中className就是superclass的派生类。

实例介绍:


class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): pass class Cat(Animal): pass
  1. 对于dog与cat来说,Animal就是它的父类。

  2. 如果在子类中找不到请求调用的属性,就搜索基类。如果基类是由别的类派生而来,这个规则会递归的应用上去。现在Dog和Cat方法都可以调用run方法了。

  3. 也可以增加方法:


class Dog(Animal): def see(self): print('see a dog')
  1. 多态(覆盖):

派生类可以覆盖其基类的方法。因为方法调用同一个对象中的其它方法时没有特权,基类的方法调用同一个基类的方法时,可能实际上最终调用了派生类中的覆盖方

法。


class Dog(Animal): def run(self): print('Dog is running...') class Cat(Animal): def run(self): print('Cat is running...')

多态的好处:


def run_twice(animal): animal.run() animal.run() ##测试多态: >>> run_twice(Animal()) Animal is running... Animal is running... >>> run_twice(Dog()) Dog is running... Dog is running...

对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

5.派生类的的实例化与普通类没有什么差别;

Python 有两个用于继承的函数:

 • 函数 isinstance() 用于检查实例类型: isinstance(obj, int) 只有在obj.__class__ 是 int 或其它从 int 继承的类型

 • 函数 issubclass() 用于检查类继承: issubclass(bool, int) 为 True,因为 bool 是 int 的子类。但是, issubclass(unicode, str) 是 Fals          ,因为 unicode 不是 str 的子类(它们只是共享一个通用祖先类 basestring)。

多重继承:

python支持多重继承:



class className(superClass1,superClass1,superClass2.....):

       <statement 1>

       .....

        <statement N>

##其中className就是superClass1,superClass1,superClass2.....的派生类。

私有变量:

只需要在数据或者方法前面加上__两个下划线就行,例如__spam。python独特的命名编码会将__spam替代为 _classname__spam

这样在外面就不能正常的 按照:类名.__spam进行调用了。但是写全的话替代为 类名. _classname__spam还是可以的,这时python的缺陷


class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score))

对于外部代码来说,是无法从外部访问实例变量.__name和实例变量.__score了

异常也是类:

可以自己定义异常的派生类,通过rasie进行抛出;

有两种抛出方式:

1.raise Classname()定义的派生类;

2.raise 实例;由异常类实例话而来;

演示如下:



class B(Exception):

    pass

class C(B):

    pass

class D(C):

    pass

for cls in [B, C, D]:

    try:

        raise cls()

    except D:

        print("D")

    except C:

        print("C")

    except B:

        print("B")

要 注 意 的 是 如 果 异 常 子 句 的 顺 序 颠 倒 过 来 ( execpt B 在 最 前 ) , 它 就 会 打 印B,B,B--第一个匹配的异常被触发。

相关链接:

python3入门之类

python3入门之函数

python3入门之循环

python3之if语句

python3入门之赋值语句介绍

python3入门之print,import,input介绍

python3入门之set

python3入门之字典

python3入门之字符串

python3入门之列表和元组

python3入门之软件安装

python3爬虫之入门和正则表达式

python3入门之类的更多相关文章

  1. 【转】Python3 (入门6) 库的打包与安装

    Python3 (入门6) 库的打包与安装 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/6940288 ...

  2. Python3入门机器学习经典算法与应用

    <Python3入门机器学习经典算法与应用> 章节第1章 欢迎来到 Python3 玩转机器学习1-1 什么是机器学习1-2 课程涵盖的内容和理念1-3 课程所使用的主要技术栈第2章 机器 ...

  3. python3入门之集合set

    之前介绍python的数据结构时,没有介绍set(集合)现在在这里稍微介绍下: set原理 Python 还 包 含 了 一 个 数 据 类 型-- set ( 集 合 ) . 集 合 是 一 个 无 ...

  4. python3入门之函数

    相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...

  5. python3入门之赋值语句介绍

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍赋值语句,以及几种特殊的赋值.下面附有之前的文章: python3入门之print,import,input介绍 python入门之字 ...

  6. python3入门之print,import,input介绍

    本节主要介绍print,import和input,t函数,包括他们在python2.7和python3 的区别以及用法.下面附有之前的文章: ​ python3的print函数的变化 python3之 ...

  7. python3入门之字典

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍字典,字典也成映射,时python中唯一内建的映射类型.更多详细请点击readmore.下面附有之前的文章: python入门之字符串 ...

  8. python3入门之字符串

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 经过前面的介绍相信大家也对python有了一个初步的了解:本节主要介绍字符串,不管学习什么编语言字符串一定在其中扮演着重要的地位.本节主要讲解,字 ...

  9. python3入门之列表和元组

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 前面一张主要学习了Python的安装,以及第一个程序helloword的编写,以及简单的输入和输出函数,这章主要介绍序列,列表,元组 序列  这章 ...

随机推荐

  1. jsp实现查询与展示功能

    今天做了一天的这个功能,开始是数据库一直打不开,显示Class not  found,一直调试,调试了一下午.原来是mysql的jar包,必须要放到WEB-INF这个目录下的lib文件夹中,然后bui ...

  2. H5 css学习

    p{text-indent:2em;}段前空两格   段落排版--行间距(行高) p{line-height:1.5em;} 段落排版--中文字间距.字母间距  h1{    letter-spaci ...

  3. const&static&extern

    const 结论: 如果const写在指针变量名的旁边, 那么指针的指向不能变, 而指向的内存空间的值可以变 如果const写在数据类型的左边或者右边, 那么指针的指向可以改变, 但是指向的内存空间的 ...

  4. CENTOS 配置好SVN服务环境后,其他服务器无法访问 Error: Can't connect to host '192.168.1.103': 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

    CENTOS 配置好SVN服务环境后,其他服务器无法访问   根据 下面的步骤配置好服务后,使用本机可以正常 连接到 SVN 服务, 但是使用局域网的其他服务器访问时出现下面的错误, Error: C ...

  5. ORACLE修改表空间方法

    一.使用imp/exp.先导出源库,再创建新库把表空间创建好,然后再导入.(据说这样可以,前提是新的库里面不能有与源库相同名字的表空间.有待验证!) 二.使用脚本进行修改.据目前所了解,正长情况下需要 ...

  6. DEPENDS工具和DUMPBIN工具使用

    在系统部署运行时我们经常发现某个程序在开发机器中可以运行,但是部署在某台PC上缺不能运行,也存在在某些机器上可运行换一台机器却不能运行.主要表现出两种现象:        (1).运行.调试时出现程序 ...

  7. 954I Yet Another String Matching Problem

    传送门 分析 我们先考虑暴力如何计算 对于S的子串SS,如果它有位置i使得SS[i] != T[i]那么我们就将两个字符之间用并查集连边 最后答案很明显就是并查集中所有边的个数 于是我们可以发现对于S ...

  8. jquery中html()、text()、val()的区别

     (2013-03-26 10:49:16) 转载▼ 分类: jquery   .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改 ...

  9. Perl 学习笔记-文件测试

    1.文件测试操作符 针对文件和目录的测试操作符: -r/-w/-x/-o: 文件或目录, 对有效的(负责运行这个程序的)用户或组来说是可读/写/执行/拥有 的; 这些测试位会查看文件的权限位, 以此判 ...

  10. win10安装MySQL免安装版

    一:下载并解压 这个就不多说了https://dev.mysql.com/downloads/mysql/,简单的很 二:MySQL根目录下新建my.ini [mysql] # 设置mysql客户端默 ...