码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象

时间:2015-12-05 00:27:47      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!