我们知道Python是一门面向对象的脚本语言。从C#的角度来看:首先Python支持多继承。Python 类型成员通常都是public的,并且所有成员函数都是virtual的(可以直接重写)。

1. 定义类型

类是对象的模板,在Python中我们使用class关键字来定义一个类型。

 # -- coding: utf-8 --
class Employee(object):
# self 关键字就是对象自身的一个引用(类似于C#中的this关键字)
def setName(self,name):
self.name = name def getName(self):
return self.name def greet(self):
print "hello,world! I'm %s" % self.name

可以这样使用我们定义好的Employee类:

 foo = Employee()
bob = Employee()
foo.setName('Sunshine')
bob.setName('Bob') foo.greet() # hello,world! I'm Sunshine
bob.greet() # hello,world! I'm Bob
print foo.name # Sunshine
bob.name = 'Bob2' # name是Employee类的一个特性
bob.greet() # hello,world! I'm Bob2

1.1 使用新式类型

在Python 2.2之后,对象的工作方式有了很大的改变,所有导致了在Python 2.x 版本中存在两种形式的类:Python 2.2之前的旧式类,和之后新增的新式类,新式类提供了很多新的特性(比如:super函数、property函数等),如果不需要兼容旧版本的Python代码那么做好使用新式类,在Python中声明新式类有两种方法:

1.把赋值语句__metaclass__ = type 放置在定义模块的最开始位置,如下:

# -- coding: utf-8 --
_metaclass_ = type # 确定使用新式类 class Employee():
pass

2.子类化object类型,或者是其他新式类型,如下:

class NewStyle(object):
pass

2. 特性和成员方法

对象包括特性和方法,特性只是作为对象的一部分的变量,成员方法则是存储在对象内部的函数。Python中的所有方法函数在声明时显式地将第一个参数(self)表示为对象(实例),这个参数的值在方法被调用时隐式赋值:

 # -- coding: utf-8 --
_metaclass_ = type # 确定使用新式类 class Class:
def method(self):
print 'I have a self' def function():
print 'i don\'t...' instance = Class()
instance.method() # I have a self
instance.method = function # 绑定一个普通的函数
instance.method() # i don't...

通过self参数可以使用该实例的所有成员对象:

 # -- coding: utf-8 --
_metaclass_ = type # 确定使用新式类 class Bird:
song = 'Squaawk!'
def sing(self):
print self.song bird = Bird()
bird.sing() # Squaawk!

2.1 私有变量和私有方法

Python其实并不存在不能访问的私有变量和私有方法。不过在Python中有一个约定:以一个下划线(_)开头的名字,应该作为一个非公共的API(不论是函数、方法或者数据成员)。我们可以这样定义一个"私有变量":

_flag = True

Python解释器在遇到任何以双下划线(__)开头的标识符将会被替换为_className__spam形式,其中className是当前的类型名称,__spam就是当前的标识符名称。所以我们可以这样定义一个"私有方法":

 # -- coding: utf-8 --
_metaclass_ = type # 确定使用新式类 class Secretive:
def __inaccessible(self):
print 'Bet you can\' see me...' def accessible(self):
print 'The secret message is:'
self.__inaccessible() s = Secretive()
# AttributeError: Secretive instance has no attribute '__inaccessible'
s.__inaccessible()

因为在类的内部定义中,所有以双下划线开始的名字都被转换成前面加上单下划线和类名的形式,所以还是可以访问私有方法:

# Bet you can' see me...
s._Secretive__inaccessible()

3. 继承

作为面向对象三个基本的特性之一———继承,我们可以利用它在现有类型的基础上创建自己的类型。在Python中定义派生类的方式如下:

 # -- coding: utf-8 --
_metaclass_ = type # 确定使用新式类 class Person:
def printName(self):
print 'Is a Person'
def printHello(self):
print 'hello,world' class Employee(Person):
# override base Method
def printName(self):
print 'Is a Employee' person = Person()
person.printName() # Is a Person
employee = Employee()
employee.printName() # Is a Employee
employee.printHello() # hello,world

可以看到子类继承了基类的方法,由于在Python中所有的成员函数都是virtual的,所有我们也可以选择重写基类的方法。

3.1 多重继承

Python是一个多继承语言,使用多重继承的语法很简单,只需要在定义子类后面的括号中添加多个父类名称即可,如:

class C(A,B):
pass

注意

多重继承(multiple inheritance)是个很有用的工具。不过除非你特别熟悉多重继承,否则应该尽量避免使用。因为它可能会有很多出乎意料的行为。例如:一个方法从多个超类继承,那么根据继承的顺序(class语句中):先继承的类中的方法会重写后继承类中的方法。

3.2 查看继承关系

Python中有两个内置函数可拥有查看继承关系:

  • 使用isinstance函数检查实例的类型
  • 使用issubclass函数检查类的继承关系

使用方式如下:

 # -- coding: utf-8 --
obj = "string"
print isinstance(obj,str) # True
print obj.__class__ # <type 'str'> print issubclass(bool,int) # True
print bool.__bases__ # (<type 'int'>,)

3.3 检查对象中的方法是否存在

使用hasattr(x,'call')来判断一个对象是否存在某个方法,如下:

 # -- coding: utf-8 --
_metaclass_ = type # 确定使用新式类 class Person:
def PrintName(self):
print 'Is a Person'
def PrintHello(self):
print 'hello,world' per = Person() # check method Exists
print hasattr(per,'PrintName') # True

参考资料&进一步阅读

深刻理解Python中的元类(metaclass)

Python基础教程(第二版)

Python入门教程——类

【循序渐进学Python】7.面向对象的核心——类型(上)的更多相关文章

  1. 跟我一起学.NetCore之选项(Options)核心类型简介

    前言 .NetCore中提供的选项框架,我把其理解为配置组,主要是将服务中可供配置的项提取出来,封装成一个类型:从而服务可根据应用场景进行相关配置项的设置来满足需求,其中使用了依赖注入的形式,使得更加 ...

  2. 【循序渐进学Python】8.面向对象的核心——类型(下)

    1 构造和初始化对象 __init__方法是Python内建众多魔法方法(什么是魔法方法?)中最常见的一个,通过这个方法我们可以定义一个对象的初始操作.当构造函数被调用的时候的任何参数都会传递给__i ...

  3. 【我要学python】面向对象系统学习

    第一节:初识类的定义和调用 c1.py #类 = 面向对象 #类 最基本作用:封装 #类中不仅可以定义变量 还可以定义函数等等,例: class student( ): name = ' ' age ...

  4. 【循序渐进学Python】14.数据库的支持

    纯文本只能够实现一些简单有限的功能.如果想要实现自动序列化,也可以使用 shelve 模块和 pickle 模块来实现.但是,如果想要自动的实现数据并发访问,以及更标准,更通用的数据库(databas ...

  5. 【循序渐进学Python】11.常用标准库

    安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...

  6. 【循序渐进学Python】9.异常处理

    1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种 ...

  7. 【循序渐进学Python】6.Python中的函数

    1. 创建函数 一个函数代表一个行为并且返回一个结果(包括None),在Python中使用def关键字来定义一个函数,如下: def hello(name): print 'hello,' + nam ...

  8. 【循序渐进学Python】5.Python常用流程控制及其他语句

    1. 赋值语句常用技巧 通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中.解包的序列中的元素必须和等号左边变量数量一致.如下: values = ...

  9. 【循序渐进学Python】4. Python中的序列——字典

    字典是Python内建的六种序列之一.字典作为一种常用的数据结构,字典中的值没有特定顺序,每个值都对应于一个唯一的键.键可以是数字.字符串甚至是元组. 1. 创建和使用字典 Python中字典可以使用 ...

随机推荐

  1. 将w3cplus网站中的文章页面提取并导出为pdf文档

    最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...

  2. github 使用记录

    安装客户端tortoiseGit 是服务端,要想在自己电脑上使用git我们还需要一个git客户端,我这里选用TortoiseGit,他给我们提供了图形界面的操作.在安装之前首先需要安装git,下载地址 ...

  3. friend class

    友元函数与友元类.   C++中以关键字friend声明友元关系.友元可以访问与其有friend关系的类中的私有成员.友元包括友元函数和友元类.   编辑本段1.友元函数 如果在本类以外的其它地方定义 ...

  4. WinStore之Application Data

    一.Application Data简介 Applicaion Data相当于桌面应用的注册表,存储一些用户配置信息,如运行时状态,用户喜好等,需要注意的时,当卸载应用时,这些数据会被删除,所以不要存 ...

  5. FastSocket客户端/服务端通讯示例

    新建控制台项目,命名为Server 添加FastSocket.SocketBase,FastSocket.Server引用   Socket命令服务类: Sodao.FastSocket.Server ...

  6. sql server 2008安装过程中服务器配置出错

    请选择:对所有 SQL Server 服务使用相同的账号: 但这里不能给他设置自己定义的账号和密码 ( 例如下面设置它的账号为 sa ,密码为 654321) 就会发生错误:

  7. linux 下面 jdk1.7 rpm 包的安装

    1.下载安装jdk7.0 for linux 我下载的版本为:jdk-7u2-linux-i586.rpm 下载地址为:http://www.oracle.com/technetwork/java/j ...

  8. [转]c#截取指定长度的字符串

    /// <summary> /// 截取指定長度的字符串 /// </summary> /// <param name="s"></par ...

  9. html5[1]:优化Android Webview性能

    尽量少用position:relative 做一个OTO项目时,页面上下滑动时,颤抖的很厉害: 页面中主要是图片比较多,开始以为是图片多的原因,但是把所有图片都不加载,还是颤抖: 后来,去掉所有外部的 ...

  10. Python 程序如何高效地调试?

    作者:Rui L链接:https://www.zhihu.com/question/21572891/answer/26046582来源:知乎著作权归作者所有,转载请联系作者获得授权. 这个要怒答一发 ...