Python学习之面向对象(class)

来源:互联网 发布:linux防火墙配置 编辑:程序博客网 时间:2024/06/08 06:39
创建类
使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例:
class ClassName:    '类的帮助信息'   #类文档字符串    class_suite  #类体

self代表类的实例,而非类
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

创建实例对象
实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。
以下使用类的名称 Employee 来实例化,并通过 __init__ 方法接受参数。
"创建 Employee 类的第一个对象"emp1 = Employee("Zara", 2000)"创建 Employee 类的第二个对象"emp2 = Employee("Manni", 5000)

访问属性
您可以使用点(.)来访问对象的属性。使用如下类的名称访问类变量:
emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount

Python内置类属性
● __dict__ : 类的属性(包含一个字典,由类的数据属性组成)● __doc__ :类的文档字符串● __name__: 类名● __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod● __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数3Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
class SubClassName (ParentClass1[, ParentClass2, ...]):    'Optional class documentation string'    class_suite

你可以使用issubclass()或者isinstance()方法来检测。
  • issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
  • isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。

方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:
基础重载方法
下表列出了一些通用的功能,你可以在自己的类重写:
序号方法, 描述 & 简单的调用1__init__ ( self [,args...] )
构造函数
简单的调用方法: obj = className(args)2__del__( self )
析构方法, 删除一个对象
简单的调用方法 : del obj3__repr__( self )
转化为供解释器读取的形式
简单的调用方法 : repr(obj)4__str__( self )
用于将值转化为适于人阅读的形式
简单的调用方法 : str(obj)5__cmp__ ( self, x )
对象比较
简单的调用方法 : cmp(obj, x)
运算符重载
Python同样支持运算符重载,实例如下:
#!/usr/bin/pythonclass Vector:    def __init__(self, a, b):        self.a = a        self.b = b    def __str__(self):        return 'Vector (%d, %d)' % (self.a, self.b)    def __add__(self,other):        return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10)v2 = Vector(5,-2)print v1 + v2以上代码执行结果如下所示:Vector(7,8)


类属性与方法
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
类的方法
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
单下划线、双下划线、头尾双下划线说明:
  • __foo__: 定义的是特列方法,类似 __init__() 之类的。
  • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
  • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
原创粉丝点击