python面向对象

1.面向对象编程跟面向过程对比

 面向过程:

    优点:复杂的问题流程化,进而简单化。

    缺点:可扩展性差。

 使用场景:linux系统管理脚本,linux内核等

面向对象:

  优点:可扩展性强

     缺点:编写难度大。

    面向对象的程序设计只是用来解决程序扩展性的。需要结合相应场景使用。

 

2.类与对象 

  在现实世界中:  是现有对象,后有类

  在程序中: 需要先定义类,后产生对象

 

3.类的定义方法

class OldboyStudent:
    school = 'oldboy' #类的数据属性
    def learn(self): #类的函数属性
        print('is learning')

 ##注意:类在代码定义阶段就会执行,所以就会产生名称空间,可以使用__dict__属性查看

print(OldboyStudent.__dict__)
print(OldboyStudent.__dict__['school'])
#也可以进行修改、增加、删除等操作。 OldboyStudent.x=1111111111111111111111 OldboyStudent.school='Oldboy' # del OldboyStudent.school print(OldboyStudent.__dict__['school']) #在python3 中可以使用__dict__查看值,但是不能通过__dict__修改值。

 

4.python为类内置的特殊属性

类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)

 

5.属性查找

类有两种属性:

   数据属性,是所有对象都可以使用的,共享的。

   函数属性,是绑定给对象用的。

6.继承

 (1).继承的功能之一:解决类与累之间的代码重复的问题

 (2)继承是类与类之间的关系,是一种,什么是什么的关系(比如oldboy的学生跟老师 都是oldboy学校的人)

 (3)在子类派生出的新的属性,以自己为准。

 (4)在子类派生出的新的方法内重用父类的功能的方式:指定道姓用。

         OldboyPeople._init_

   这种调用方式本身与继承是没有关系的


6.1 python中的继承分为:单继承和多继承。
class Aa: #定义父类
    pass
class Bb:  #定义父类
    pass

class Cc(Aa):  #单继承,派生类或者子类是Cc
    pass

class Dd(Aa,Bb):   #python支持多继承,用逗号隔开多个继承的类
    pass
print(Dd.__bases__)  #查看继承关系

 

6.2 经典类跟新式类

python2中才有经典类跟新式类的区别,在python3中都是新式类

在python2中只有继承object类的类才是新式类

在Python2中没有继承object的类都是经典类


6.3 在子类中重用父类的方法并且自己单独定义一下变量
class Animal:
    x=1
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
  
    def eat(self):
        print('%s eat' %self.name)

    def talk(self):
        print('%s say' %self.name)

class People(Animal):
    x=10  #子类跟父类直接有冲突的时候以自己定义的为主
    def __init__(self,name,age,sex,education):
        Animal.__init__(self,name,age,sex)  #在这里写上父类的__init__
        self.education=education   #在这里定义上属于自己这个类自己的参数
peo1=People('小六',18,'male','运维总监')
print(peo1.__dict__)
print(peo1.x)
运行结果:

 

6.3 组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

代码示例:
#定义一个学校人员的类
class OldboyPeople:
    school = 'oldboy'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def eat(self):
        print('is eating')

#定义一个学生类,继承学校人员父类
class OldboyStudent(OldboyPeople):
    def __init__(self,name,age,sex):
        OldboyPeople.__init__(self,name,age,sex)
        self.kencheng=[]
    def learn(self):
        print('%s is learning'  %self.name)

#定义一个老师类继承学校人员父类
class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,salary,title):
        OldboyPeople.__init__(self,name,age,sex)
        self.salary=salary
        self.title=title
        self.kecheng=[]

    def teach(self):
        print('%s is teaching'  %self.name)

#定义一个课程类
class Kecheng:
    def __init__(self,kecheng_mingzi,kecheng_zhouqi,kecheng_qian):
        self.kecheng_mingzi=kecheng_mingzi
        self.kecheng_zhouqi=kecheng_zhouqi
        self.kecheng_qian=kecheng_qian
    def aa_info(self):
        print('课程名称:%s 课程周期:%s 课程价格:%s'%(self.kecheng_mingzi,self.kecheng_zhouqi,self.kecheng_qian))

#定义两个课程对象。
python=Kecheng('python','一个月',1000)
linux=Kecheng('linux','一个月',9000)

#定义一个老师对象t1 t1去选择课程。
t1=OldboyTeacher('egon',19,'',11,'高级讲师')
t1.kecheng.append(python)  #往自己的对象中kecheng列表中添加,课程这个对象名称。
for i in t1.kecheng:
    i.aa_info()  #直接通过课程对象名称找到对象类中定义的课程详情。
    
#定义一个学生对象s1 s1去选择课程。
s1=OldboyStudent('yxwang',19,'')
s1.kencheng.append(linux)
for i in s1.kencheng:
    i.aa_info()

 

6.4 类中定义函数的两大分类
(1).绑定方法
绑定到类的方法:用classmethod装饰器的方法
类.boud_method(),自动将类当作第一个参数传入

绑定到对象的方法:没有被任何装饰器装饰的方法
对象.boud_method(),自动将对象当作第一个参数传入

(2)非绑定方法
用staticmethod装饰器装饰的方法。
不与类或对象绑定,类和对象都可调用。但是没有自动传值一说。就是个普通工具而已。
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,
对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说


7.子类中调用父类中的方法的两种方式

(1),指名道姓法:(这种方法其实并不依赖继承关系,因为是直接指定类名去引用的)
class OldboyPeople:
    school = 'oldboy'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def eat(self):
        print('is eating')
    def teach(self):
        print('这是父类的teach')

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,title):
        OldboyPeople.__init__(self,name,age,sex)
        self.title=title

    def teach(self):
        OldboyPeople.teach(self)
        print('%s is teaching'  %self.name)

egon_obj=OldboyTeacher('user01',18,'male','打酱油')
egon_obj.teach()

 



(2)super方法
class OldboyPeople:
    school = 'oldboy'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def eat(self):
        print('is eating')
    def teach(self):
        print('这是父类的teach')

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,title):
        # OldboyPeople.__init__(self,name,age,sex) 
        #在Python2中需要写全:super(OldboyTeacher,self)
        super().__init__(name,age,sex)  #使用super方法重用父类中的__init__方法
        self.title=title

    def teach(self):
        # OldboyPeople.teach(self)
        super().teach()  #使用super重用父类中的teach方法
        print('%s is teaching'  %self.name)

egon_obj=OldboyTeacher('user01',18,'male','打酱油')
egon_obj.teach()

 

两种方法使用哪一种都可以,但是最好不用混在一起用











 



posted @ 2017-08-16 16:38  嘟囔囔小孩  阅读(176)  评论(0编辑  收藏  举报