标签:
1.为什么使用面向对象
原因有很多,其中最重要的优点 ----- 多态、封装、集成。
多态:
就算不知道变量所引用的对象类型是什么,还是能进行操作。而它也会根据对象类型的不同表现出不同的行为。
任何不知道对象到底是什么类型,但是又要对对象对点什么的时候,都会用到多态。
举个例子,如下
a = ‘123‘ print(a)
a = [1,2,3] print(a)
a = {1:(2,3)} print(a)
******************************
123
[1, 2, 3]
{1: (2, 3)}
说明:对于print方法,a,b,c三种对象都可以被其执行,这便是多态的体现
封装:
封装是指向程序中其他部分隐藏对象的具体实现细节的原则。
封装可以不用关心对象是如何构建的而直接进行使用。
继承
如果已经有了一个类,而又想建立一个非常类似的呢?
使用继承
2.类和类型
2.1类到底是什么?
可以视为类型和种类
所有的对象都属于某一个种类,属于类的实例
当一个对象所属的类型是另一个对象所属的子集时,前者被称为后者的子类,反之称为超类。
2.2创建自己的类
####python中习惯使用单数名词且首字母大写命名类
__metaclass__ = type #确定使用新式类
class Person: #创建类
def a(self): #定义其中方法
pass
上面的类看着都挺好,只是那个self有点怪。
self是对于对象自身的调用,如果没有它的话成员方法就无法访问他们要进行操作的对象本身了。
2.3特性、函数和方法
self方法实际上正是方法和函数的区别。方法将他们的第一个参数绑定在所属的实例上,因此无需显示的提供该参数。
对象的有自己的状态,此状态由它的特性描述。
对象的方法可以改变它的特性
特性可以在外部访问
2.4私有化
私有特性,使外部无法访问,但可以使用访问器等访问。
python中没有私有化的方式,但可以通过一些办法达到相同效果,只要在类中方法的名字前面加‘__‘即可。
class Test:
def __test1(self): #私有方法
print(‘private‘)
def test2(self): #普通方法,调用私有方法
print(‘public‘)
self.__test1()
t = Test()
t.__test1()
**********************
AttributeError: Test instance has no attribute ‘__test1‘ #直接执行私有方法,报错
t.test2()
*********************
public #访问test2(),可以在内部调用私有方法
private
实际上还是能访问私有方法
t = Test()
t._Test__test1()
*********************
private #执行成功,原因是在类的内部定义中所有__开头的名字都被翻译成_类名__方法名的形式
2.5类的命名空间
在类的作用域中可定义能提供所有成员访问的变量,但特性被实例赋予新值时,类范围的变量会被屏蔽
class MemberCounter():
members = 0
def __init__(self):
MemberCounter.members += 1
m1 = MemberCounter()
m2 = MemberCounter()
print m1.members
print m2.members
m1.members = 10 #特性被实例赋予新值
print m1.members
print m2.members
*********************************
2
2
10
2 #类范围的变量被屏蔽
2.6指定超类
将其他类名写在class后的()内即可指定超类
class ca():
def __init__(self):
print(‘i am a‘)
def func1(self):
print(‘yeah‘)
class cb(ca): #指定父类为ca
def __init__(self): #重写某方法
print(‘i am b‘)
b = cb()
b.func1() #执行父类方法
***************************
i am b
yeah
2.7检查继承
想查看一个类是否是另一个类的子类,可以使用内建的issubclass函数
print issubclass(cb,ca)
***************************
True
print issubclass(ca,cb)
***************************
False
2.8多个超类
一个类继承不止一个父类时
class cc(ca,cb): #继承ca,cb
def __init__(self):
print(‘i am c‘)
2.9 super函数
子类在重写父类构造方法时应使用super函数
当前类和对象可以作为super函数的的参数使用,调用函数返回对象的任何方法都是调用超类的方法。
__metaclass__ = type #定义新式类
class ClassA:
def __init__(self):
self.a = ‘i am a‘
def printSth(self):
print self.a
class ClassB(ClassA):
def __init__(self): #重写父类构造方法
super(ClassB,self).__init__() #使用super()函数调用父类构造方法
ca = ClassA()
cb = ClassB()
cb.printSth()
标签:
原文地址:http://www.cnblogs.com/liqxd/p/5020789.html