Python类和实例
1.Python类和实例
(1)类是一种数据结构,可用于创建实例
*一般情况下,类封装了数据和可用于该数据的方法
(2)Python类是一个可调用对象,即类对象
(3)类是一种自定义类型,而实例则是声明某个自定义类型的变量
(4)实例初始化
*通过调用类来创建实例
*类在实例化时可以使用__init__和__del__两个特殊方法
In [12]: l1 = ['a','b','c','d']
In [13]: type(list)
Out[13]: type #类
In [14]: type(l1)
Out[14]: list
2.Python中创建类
*python中使用 class 关键字创建类
*类名必须首字母大写
(1)class ClassName(base):
'class documentation string'
class suite
(2)超类是一个或多个用于继承的父类集合
(3)类体可以包含:声明语句|类成员定义|数据属性|方法
*注意:
如果不存在继承关系,ClassName后面的"(base)"可以不提供
类文档可选
*class语句的一般形式
class ClassName(base):
data = value #定义数据属性
def method(self,...): #定义方法属性
self.member = value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
In [1]: class Testclass(): #定义类,类名首字母大写
...: pass
...:
In [2]: type(Testclass)
Out[2]: classobj #类对象
In [3]: obj1 = Testclass() #实例化类
In [4]: type(obj1)
Out[4]: instance #实例
(&)非常重要的例子
In [8]: class FirstClass():
...: data = 'hello class'
...: def printdata(self):
...: print self.data
...:
In [9]: insl = FirstClass()
In [10]: insl.
insl.data insl.printdata
In [10]: insl.data
Out[10]: 'hello class'
In [11]: insl.printdata
Out[11]: <bound method FirstClass.printdata of <__main__.FirstClass instance at 0x28b8f80>>
In [12]: insl.printdata()
hello class
In [19]: class SecClass():
....: data = 'hello secClass'
....: def printdata(self):
....: print "Content from method : %s" %self.data
....:
In [20]: ins2 = SecClass()
In [21]: ins2.data
Out[21]: 'hello secClass'
In [22]: ins2.printdata()
Content from method : hello secClass
*创建某个实例自有数据
In [23]: class ThirdClass():
....: data = "hello ThirdClass"
....: def setdata(self,x):
....: self.str = x
....: def printdata(self):
....: print self.str
....:
In [24]: ins4 = ThirdClass()
In [25]: ins4.data
Out[25]: 'hello ThirdClass'
In [26]: ins4.
ins4.data ins4.printdata ins4.setdata
In [26]: ins4.setdata('abcd')
In [27]: ins4.printdata()
abcd
3.构造器 | (析构函数)
*在python创建初期,Python会自动调用类中的__init__方法,以隐形地为实例提供属性
(1)__init__方法被称为构造器
(2)如果类中没有定义__init__方法,实例创建之初,仅是一个简单的名称空间
(3)__varname__()双下划线开始的变量名,会被 python 解释器在某种情况下自动调用(a+b = a.__add__(b))
In [7]: class Myclass():
...: data = 'hello Myclass' | 类变量
...: def __init__(self,x):
...: self.str1 = x
...:
In [9]: i1 = Myclass('zxd')
In [10]: i1.
i1.data i1.str1
In [10]: i1.data
Out[10]: 'hello Myclass'
In [11]: i1.str1
Out[11]: 'zxd'
(4)可使用类的__dict__字典属性或 Python 内置的 dir() 函数来获取类的属性
In [12]: Myclass.__dict__
Out[12]:
{'__doc__': None, #类的文档字串
'__init__': <function __main__.__init__>,
'__module__': '__main__', #类定义所在的模块
'data': 'hello Myclass'} #类自有的属性
(5)实例的特殊属性
4.类方法的可用变量
(1)实例变量:指定变量名称及实例自身进行引用
self.变量名
(2)局部变量:方法内部创建的变量,可直接使用
(3)类变量(也称静态变量):通过指定变量名与类名进行引用
类名.变量名
(4)全局变量:直接使用
5.继承
(1)继承描述了基类的属性如何“遗传”给派生类
*子类可以继承它的基类的任何属性,包括数据属性和方法
*一个未指定基类的类,其默认有一个名为object的基类
*Python允许多重继承
(2)创建子类
*创建子类时,只需要在类名后面跟一个或从其中派生的父类
*class SubClassName(ParentClass1,[ParentClass2,..])
'optional class documentaton string'
class_suite
继承方法的专用化
(3)继承会先在子类寻找变量名,然后再查找父类,因此子类可以对父类的属性重新定义来取代继承而来的行为
*子类可以完全取代从父类继承而来的属性
*也可以通过已覆盖的方法回调父类来扩展父类的方法
6.类实例和其它对象的内建函数
(1) issubclass()
*布尔函数,判断一个类是否由另一个类派生
*语法:issubclass(sub,sup) 判断sub是不是属于sup
(2) isinstance()
*布尔函数,判断一个对象是否是给定类的实例
*语法:isinstance(obj1,class_obj2) obj1是不是给定类的实例
In [1]: l1 = [1,2,3]
In [2]: isinstance(l1,list)
Out[2]: True
(3) hasatter()
*布尔函数,判断一个对象是否拥有指定属性
*语法:hasatter(obj,'attr')
*同类的函数还有:getattr()|setattr()|delattr()
(4) super()
*在子类中找出其父类以便于调用其属性
*一般情况下仅能采用非绑定的方式调用祖先类方法
*而super可用于传入实例或者类型对象
*语法:super(type[,obj])
7.运算符重载
概述:运算符重载是指在方法中拦截内置的操作--当类的实例出现在内置操作中,Python会自动调用自定义的方法,并且返回自定义方法的操作结果
*运算符重载让类拦截常规的Pythoon运算
类可重载所有Python表达式运算
类也可重复打印、调用函数、属性点号运算等内置运算
*重载使类实例的行为像内置类型
*重载通过提供特殊名称的类方法实现
运算符重载并非必要,并且通常也不是默认的
8.基于特殊的方法定制类