python基础篇【第七篇】面向对象(上)

提到面向对象,总是离不开几个重要的术语:多态(Polymorphism),继承(Inheritance)和封装(Encapsulation

定义一个类可以采用下面的方式来定义:

class className:    #定义函数用def  定义类也是一样需要class
    block

注意类名后面有个冒号,在block块里面就可以定义属性和方法了。当一个类定义完之后,就产生了一个类对象。类对象支持两种操作:引用和实例化。引用操作是通过类对象去调用类中的属性或者方法,而实例化是产生出一个类对象的实例,称作实例对象。比如定义了一个people类:

class people:
    name = 'jack'       #定义了一个属性
    #定义了一个方法
    def printName(self):    #在类里面定义一个函数称之为方法。
        print self.name

people类定义完成之后就产生了一个全局的类对象,可以通过类对象来访问类中的属性和方法了。进行实例化操作,p=people( ),这样就产生了一个people的实例对象,此时也可以通过实例对象p来访问属性或者方法了(p.name) ;这里面的p就为people 的对象

name是一个属性,printName( )是一个方法,与某个对象进行绑定的函数称作为方法。一般在类里面定义的函数与类对象或者实例对象绑定了,所以称作为方法;而在类外定义的函数一般没有同对象进行绑定,就称为函数。

在类中可以根据需要定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,,默认以名为'self'的变量作为该参数(用其他名称也可以)在,而且需要作为第一个参数。下面看个例子:

class people:
    name = 'jack'
    age = 12

    def getName(self):
        return self.name
    def getAge(self):
        return self.age

p = people()
print(p.getName(),p.getAge())

 

构造方法

在Python中有一些内置的方法,这些方法命名都有比较特殊的地方(其方法名以2个下划线开始然后以2个下划线结束)

__init__(self,....)在生成对象时调用,可以用来进行一些初始化操作,不需要显示去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。

 

class Vector:
    def __init__(self, a, b):
        self.a = a
        self.b = b

继承:
面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

# ---------------继承-----------------
class Animals:
 
    def chi(self):
        print(self.name + "\t吃")
 
    def he(self):
        print(self.name + "\t喝")
 
    def piao(self):
        print("嫖娼-1")
 
class Uncle:
    def du(self):
        print("赌博")
 
    def piao(self):
        print("嫖娼-2")
 
class Dog(Animals,Uncle):
    def __init__(self,name):
        self.name = name
 
    def jiao(self):
        print(self.name + "\t汪汪汪~")
 
alex = Dog("李杰")
alex.piao()

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

 

多继承:
Python的类可以继承多个类,Java和C#中则只能继承一个类
Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先

 

当类是经典类时,多继承情况下,会按照深度优先方式查找
当类是新式类时,多继承情况下,会按照广度优先方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

 

 

#经典类<br>class D:
 
    def bar(self):
        print 'D.bar'
 
 
class C(D):
 
    def bar(self):
        print 'C.bar'
 
 
class B(D):
 
    def bar(self):
        print 'B.bar'
 
 
class A(B, C):
 
    def bar(self):
        print 'A.bar'
 
a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

 

#新式类
 
class D(object):
 
    def bar(self):
        print 'D.bar'
 
 
class C(D):
 
    def bar(self):
        print 'C.bar'
 
 
class B(D):
 
    def bar(self):
        print 'B.bar'
 
 
class A(B, C):
 
    def bar(self):
        print 'A.bar'
 
a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

 




posted @ 2016-06-24 23:18  也敲寡妇门  阅读(183)  评论(0编辑  收藏  举报