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

面向对象

时间:2018-08-22 15:01:03      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:country   优点   core   col   步骤   效果   特点   没有   linu   

一.面向对象编程概述:                                                                                 
  1.面向过程编程  
    面向过程编程:核心是过程二字,指的是解决问题的步骤 ,即先干什么,在干什么,好比一条流水线,是一种机械是的思维方式
  一旦完成基本很少改变的场景,linux内核,git ,ApacheHTTPServer 等
  缺点:扩展性能低下

  2 面向对象编程 
    面向对象编程:基于面向对象设计程序好比在创造一个世界,你就是一个上帝,周围存在的事物都是对象,
    不存在的也可以创造出来,与面向过程机械是的思维烦那个是形成鲜明对比,面向对象更加注重对现实世界的模拟,是一种上帝的思维方式\
    优点:解决了程序的扩展性
    缺点:编程的复杂度远高于面向过程

  3:类与对象:
  类即类别,种类,是面向对象设计最重要的概念,
  对象是特征与技能的结合体
  类是有一系列对象相似的特征与技能的结合体


技术分享图片

  

  4 类与对象的__init__方法:
    
# __init__方法
# 强调:
#   1、该方法内可以有任意的python代码
#   2、一定不能有返回值
class People:
    country=China
    x=1

    def __init__(obj, name, age, sex): #obj=obj1,x=‘egon‘,y=18,z=‘male‘
        # if type(name) is not str:
        #     raise TypeError(‘名字必须是字符串类型‘)
        obj.name = name
        obj.age = age
        obj.sex = sex


    def run(self):
        print(----->, self)


# obj1=People(‘egon‘,18,‘male‘)
obj1=People(3537,18,male)

# print(obj1.run)
# obj1.run() #People.run(obj1)
# print(People.run)

  

  5 类的特殊属性

  

  技术分享图片
#python为类内置的特殊属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
View Code

 

  

    技术分享图片
"""
class OldboyStudent:
    school = ‘oldboy‘  #相同的特征
    def choose_course(self):
        print(‘choose course‘)

#     print(‘>>>>‘)
# print(OldboyStudent.__dict__)
# print(OldboyStudent.school)
# 调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象/实例
# 会产生一个对象然后返回
stu1=OldboyStudent()
stu2=OldboyStudent()
stu3=OldboyStudent()

print(stu1.__dict__)
print(stu2.__dict__)
print(stu3.__dict__)

stu1.name=‘lzq‘
stu1.age=78
stu1.sex=‘female‘
print(stu1.__dict__)
stu2.name=‘wxb‘
stu2.age=8
stu2.sex=‘female‘
print(stu2.__dict__)
stu3.name=‘jh‘
stu3.age=9
stu3.sex=‘female‘
print(stu3.__dict__)
"""


# 为对象定制自己独有的特征,简化方案二
"""
class OldboyStudent:
    school = ‘oldboy‘  #相同的特征

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex


    def choose_course(self):
        print(‘choose couese‘)

a=OldboyStudent(‘ouyang‘,18,‘male‘)

print(a.__dict__)
"""
"""
xxx=33333
class OldboyStudent:
    school = ‘oldboy‘
    # xxx=2222
    yyy=333
    def __init__(obj, name, age, sex):
        # print(OldboyStudent.yyy)
        print(yyy)

        obj.name = name #stu1.name=‘李铁蛋‘
        obj.age = age   #stu1.age=18
        obj.sex = sex   #stu1.sex=‘male‘

    def choose_course(self):
        print(‘choosing course‘)

# 1. 属性查找顺序
stu1=OldboyStudent(‘李铁蛋‘,18,‘male‘)
# print(stu1.__dict__)
# print(OldboyStudent.__dict__)
# stu1.xxx=111
# print(stu1.__dict__)
# 先从对象自己的名称空间找,没有则去所属的类中找
# print(stu1.xxx)

"""


xxx=33333
class OldboyStudent:
    school = oldboy
    # xxx=2222
    yyy=333
    count=0

    def __init__(obj, name, age, sex):
        # print(OldboyStudent.yyy)
        # print(obj.yyy)

        OldboyStudent.count+=1
        obj.name = name #stu1.name=‘李铁蛋‘
        obj.age = age   #stu1.age=18
        obj.sex = sex   #stu1.sex=‘male‘

    def choose_course(self):
        print(choosing course)

stu1=OldboyStudent(andy,18,male)
stu2=OldboyStudent(xiaohui,17,female)
stu3=OldboyStudent(刘银弹,28,male)
print(stu1.count)
print(stu2.count)
print(stu3.count)
基础代码

  1

二:面向对象之继承与派生                                            

  一.(一) : 继承

  1 什么是继承

    继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为父类\基类\超类
 Python 中继承的特点
 1 子类可以遗传/重用父类的属性
 2 Python 中一个子类可以同时继承多个父类
 3 在继承背景下说,Python中的类可分为两种:新式类,经典类
新式类: 但凡继承了objict的类Foo以及该类的子类 都是新式类
在python3中一个类即便是没有显式地继承任何类,默认就会继承object
即python3中所有的类都是新式类
经典类: 没有继承object的类,以及该类的子类...都是经典类
在python2中才区分新式类与经典类,
python2中一个类如果没有显式地继承任何类,也不会继承object

    2 为何要用继承:
    减少类与类之间代码冗余

    

    3 

    # 在子类中调用父类的方法:
    # 方式一:指名道姓的,即父类名,父类方法
    
技术分享图片方式一
技术分享图片
class Vehicle:
    Country=China
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed =speed
        self.load=load
        self.power=power

    def run(self):
        print("哥哥要开始咯")

class Subway(Vehicle):
    def __init__(self,name,speed,load,power,line):
        super().__init__(name,speed,load,power)
        self.line=line

    def run(self):
        print(该地铁的名字是%s,速度为%s,最大装载量是%s,动力来源是%s,%s线路%(self.name,self.speed,self.load,self.power,self.line))


car1=Subway(中国高铁,100km/h,1000人/厢,100匹,12)
car1.run()
方法二

 

    4  在子类派生出的新方法中重用父类功能的方式一:

  指名道姓的引用某一个类中的函数

  总结:
  1 与继承无关
  2访问是类的函数,没有自动传值得效果
  代码如下
  
        技术分享图片
class home:
    sate=河北省张家口市阳原县东城镇七马坊村
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class xiaohui(home):
    def __init__(self,name,age,sex,hobby=run):
        home.__init__(self,name,age,sex)

    def f1(self):
        print("%s是我的名字"%self.name)
        pass

class yong(home):
    def __init__(self,name,age,sex,hobby=play game):
        home.__init__(self,name,age,sex)


    pass

num1=xiaohui(晖晖,18,)
num2=xiaohui(勇哥,18,)
print(num1.__dict__)
print(num2.__dict__)
View Code

  5  在单继承背景下属性的查找优先级:对象-->对象的类-->父类-->父类

  

        技术分享图片
class f1:
    x=1

class f2(f1):
    # x=2
    pass
class f3(f2):
    # x=1
    pass

class f4(f3):
    # x=0
    pass
obj=f4()
# obj.x=5
print(obj.x)
print()




class Foo:
    def f1(self):
        print(Foo.f1)

    def f2(self):
        print("Foo.f2")
        self.f1()

class Bar(Foo):
    def f1(self):
        print(Bar.f1)

obj=Bar()
obj.f2()
View Code

  6    在多继承背景下属性的查找优先级:

如果一个子类继承多个分支(多个分支没有共同继承一个非object的类)
此时属性查找的优先级是:对象-->对象的类-->按照从右到左的顺序一个分支一个分支的找下去
技术分享图片
class G:
    # x=‘G‘
    pass



class E(G):
    # x=‘E‘
    pass

class F:
    # x=‘F‘
    pass

class B(E):
    # x=‘B‘
    pass

class C(F):
    # x=‘C‘
    pass

class D:
    x=D
    pass

class A(B,C,D):
    # x=‘A‘
    pass


obj=A()
# obj.x=111

print(obj.x)
View Code

 

  7  在子类派生出的新方法中重用父类功能的方式二:super() 必须在类中使用


在Python2中 super(自己的类名,自己的对象)
在Python3 中:super()
调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,完全参展mro 类表
总结:
1 严格依赖集成的mro列表
2 访问是绑定方法,有自定传值的效果
  
      技术分享图片
class OldboyPeople:
    school = Oldboy
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

class OldboyStudent(OldboyPeople):
    def __init__(self,name,age,sex,score=0):
        super().__init__(name,age,sex)
        self.score=score

    def choose_course(self):
        print("%s choosing course"%self.name)


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

    def score(self,stu,num):
        stu,score=num
#
stu1=OldboyStudent(泽强,18,male)
print(stu1.__dict__)

teal=OldboyTeacher(egon,18,male)
print(teal.__dict__)
View Code



 
 一(一) 派生

 
   子类添加自己新的属性或者在自己这里重新定义这些属性而且不会影响到父类,需要注意的是,要是自己定义的属性和父类的同名,
  在调用新增属性是,就以自己的为准

 

 

 




面向对象

标签:country   优点   core   col   步骤   效果   特点   没有   linu   

原文地址:https://www.cnblogs.com/ouyang99-/p/9517238.html

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