python-面向对象-类的定义和实例化
python是一种面向对象编程语言,自然也有类的概念。python中的类通过class 关键字定义,提供了面向对象的所有标准特性,例如允许一个类继承多个基类, 子类可以覆盖父类的方法,封装,继承,多态 面向对象的三大特性,python一样不少。
1.类的定义
#coding=utf-8 class clazz: def __init__(self,names,age): self.names=names; self.age=age; def run(self): print "name:"+format(self.names),"ages:"+format(self.age); print clazz.__name__; s=clazz("xiaoxiao",35); s.run();
#类名clazz,使用clazz的属性来访问它
print clazz.__name__;
在类里面,同样用def关键字来定义函数,但是我们管类里的函数叫方法。
2.类的初始化函数与实例属性
__init__是初始化函数,当实例被构造出来以后,使用__init__方法来初始化实例属性。
name 和 age都是实例的属性,属性就是数据。说了半天实例,到底谁是实例,在类的方法里,self就是实例,如果你有其他编程语言的经验,python中的self等同于其他编程语言里的this。
3.实例化
类是一种封装技术,我们把数据和方法都封装到了类里,如果你想使用数据和方法,那么你需要用类创建出一个实例来,这个过程就叫做实例化
s 就是创建出来的实例,s是类Stu的一个实例。在定义Stu的时候,要求实例必须有name和age属性,因此,在创建示例时,我们必须提供这些属性,按照__init__函数的参数列表传入'小明' 和 18。
s.run() 这行代码是在调用实例的run方法,不同于之前所学习的函数,类里的方法只能通过实例或者类来调用,调用的方式就如代码里演示的那样。
4.self是什么?
你或许已经注意到,类里定义的每个方法都有一个self参数,它并不是默认参数,但这个参数在方法被调用时是不需要传参的,这与之前所学过函数内容相违背。
self是方法的一个参数,在方法调用时,这个参数是默认传参的。
class clazz: def __init__(self,names,age): print "__init__:",id(self); self.names=names; self.age=age; def run(self): print "run:",id(self); print "name:"+format(self.names),"ages:"+format(self.age); print clazz.__name__; s=clazz("xiaoxiao",35); s.run();
运行结果:
clazz __init__: 42401544 run: 42401544 name:xiaoxiao ages:35
self的内存地址,和s的内存地址是一致的,这可以证明,self就是s。函数被定义以后,在任何地方都可以调用,没有调用的主体,而类的方法,则需要一个调用主体,哪个实例调用了类的方法,self就会绑定为哪个实例,self这个参数就是哪个实例。
分析上面的输出结果,在__init__方法被调用时,s这个对象就已经被创建好了,这可以证明它不是构造方法,真正的构造方法是__new__,在没有调用构造方法前,对象是不存在的。
5.对象属性的访问
对象属性的访问与修改,只能通过对象来进行
#coding=utf-8 class clazz: def __init__(self,name,age): print("开始初始化...") self.name=name; self.age=age; def info(self): print "{name}今年{age}岁".format(name=self.name,age=self.age); s=clazz("tom",12); s.info(); s.age=33; s.info();
运行结果:
开始初始化...
tom今年12岁
tom今年33岁