类的定义
使用class关键字定义个类,并且类名的首字母要大写; 当程序员需要创建的类型不能用简单类型表示时就需要创建类。
类把需要的变量和函数组合在一起,这种包含也称之为封装。
Python类的结构
class 类名
成员变量
成员函数
定义一个类:
class Ren:
name = “张三”
sex = “男”
high = “1.76”
wight = “130kg”
def run(self):
print “跑步”
对象的创建:
创建对象的过程称之为实例化;当一个对象被创建后,包含三个方面的特性:对象 的句柄、属性和方法。
句柄用于区分不同的对象 对象的属性和方法与类中的成员变量和成员函数对应
if name==”main“: //自己调用执行以下代码,别人调用不执行以下代码
myclass1=myclass() // 创建类的一个实例对象
zhangsan = Ren() print zhangsan.name zhangsan.name=”张三” //设置属性
zhangsan.money=100 //添加属性 print zhangsan.money
Python对象的体系结构
经典对象-内部由属性和方法组成,属性可以是数据类型也可以是函数类型,如属性 为函数则该属性就是一个方法。
类的内部方法 Python类当中提供了一些内部方法,方法名由前后两个下划线加字幕 组成。
例如Python的构造函数int.int前后均为 两个下划线。
新型对象 定义新型对象,必须继承ojbjct方法class_name新型对象提供了对类方法和静态方法的支持
类的属性:
类由属性和方法组成,类的属性的对数据的封装,类的方法则是对类的行为的封装 。
类的属性按使用范围分为公有属性和私有属性,类的属性范围取决于属性的名称
公有属性:
所有公有属性 就是在类中和类外调用的属性。
私有属性:
不能被类以外的函数调用 (可以公告instance._classname_attribute方式访问,但只用于调试程序)
定义方法:
以__双下划线开始的成员变量就是私有属性,否则是公有属性
内置属性:由系统在定义类的时候默认添加的,由前后两个下划线构成 dict,name
私有属性可以用类的方法调用
run(self):
print self.__name
类的方法:
方法的定义 和函数定义一样,但是需要self作为第一个参数 类方法也分为:公有方法和私有方法
私有方法:不能被外部的类和方法调用,私有方法的定义和私有属性的定义都是一 样的,在方法的前面加上“__”双下划线就可以了
类直接调用方法: 类方法:使用classmethod()函数处理过的函数,能被类所调用, 也能被对象所调用(是继承的关系);
静态方法:相当于“全局函数”,可以被类直接调用,可以被所有实例化对象共享 ,通过staticmethod()定义静态方法没有self语句;
self参数: 用于区分函数和类的方法(必须有一个self),self参数表示指向对象本身。
在类中声明方法
@classmethod //使用装饰器来调用类函数,
动态方法
def mo(self):
print “世界末日”
print Ren.mo()
@staticmethod //声明静态函数,
静态方法
def mo():
print “世界末日”
re=statcmethod(mo)
print Ren.re
内部类
所谓内部类,就是在类的内部定义的类,主要目的是为了更好的抽象现实世界,
内部类的举例: 汽车是个类,汽车的底盘,轮胎也可以抽象为类,将其定义到汽车类中,则形成内部类,更好的描述汽车类,因为底盘,轮胎是汽车的一部分。
一般不赞同使用内部类,会使程序结构复杂,但是理解内部类有助于理解模块的调用。
内部类的实例化方法
方法1:直接使用外部类调用内部类:
调用格式:
object_name=outclass_name.inclass_name()
outclass_name表示外部类的名称,
inclass_name表示内部类的名称,
object_name 表示内部类的实例
方法2:先对外部类进行实例化。然后在实例化内部类
调用格式:
out_name=outclass_name()
in_name=out_name.inclass_name()
in_name.method() out_name()
表示外部类的实例,in_name 表示内部类的实例
构造函数和析构函数
构造函数:
用于初始化类的内部状态,Python提供的构造函数是int(); int()方法是可选的,如果不提供,Python会给出一个默认的int方法
一般对数据的获取需要自定义的get和set方法
class Ren():
def init(self,x=’’):
z=self.name=x
print z
zhang= Ren(‘张三’)
析构函数
户释放对象占用的资源,Python提供的析构函数是del(); del也是可选的,如果不提供则Python会在后台提供默认的析构函数
如果要显示的调用析构函数,可以使用del关键字,方式如下:
del 对象名
def del(self):
self.p.close()
垃圾回收机制
Python采用的垃圾回收机制来清理不在使用的对象;
Python提供gc模块释放不再使用的对象 Python采用引用计数 的算法方式来处理回收
即:当某个对象在其作用域内不在被其他对象引用的时候,Python 就自动清除对象;
Python的函数collect()可以一次性收集所有待处理的对象 gc.collect()
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://… 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。
语法
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,
如下所示:
class SubClassName (ParentClass1[, ParentClass2, …]):
‘Optional class documentation string’
class_suite