zoukankan      html  css  js  c++  java
  • python面向对象基础


    摘自:女神博客

    面向过程与面向对象

    面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好的一条流水线,考虑周全什么时候处理什么东西。

    优点:极大降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。

    缺点:一套流水线或者流程就是解决一个问题,代码牵一发而动全身。

    应用场景:一旦完成基本很少改变的场景,著名的例子有Linux内核,git,以及Apache HTTP Server等。

    面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须要把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。面向对象的程序设计好比如如来设计西游记,如来要解决的问题是把经书传到东土大唐,如来想了想解决问题需要四个人:唐僧,孙悟空,沙和尚,八戒,每个人都有各自的技能和特征(这就是面向对象的该概念,特征和技能分别对应对象的属性和方法),然而这并不好玩,于是如来又安排一群妖魔鬼怪,又怕师徒四人在取经路上被搞死,有安排了一群神仙保驾护航,都是对象。然后开始取经,师徒四人与妖魔鬼怪神仙相互缠斗着,直到最后取得真经。如来根本不会管师徒四人按照什么流程去取。

    优点:解决了程序的扩展性。对某个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征技能修改都很容易。

    缺点:可控性查,无法面向过程的程序的程序设计流水线式的可以精准的预测问题的流程处理与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测结果。于是我们经常看到一个游戏角色的某一参数的修改极有可能导致阴霸技能的出现,一刀砍死3个人,这个游戏就失去了平衡。

    应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象大显身手的好地方。

    在python中,面向对象的程序设计并不是全部。

    面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率,另外,基于面向对象的的程序可以使其他人更容易理解你的代码的逻辑,从而使团队开发变得更加从容。

    了解一些名词:类、对象、实例、实例化、

    类:具有相同特征的一类事物(人、狗、老虎)

    对象/实例:具体的某一事物(隔壁阿花、楼下旺财)

    实例化:类——>对象的过程

    类和对象

    python中一切皆为对象,类型的本质就是类。

    print(type(dict))   #<class 'type'>
    d=dict(name='eva') #实例化
    print(d.pop('name')) #向d发一条消息,执行d的方法pop

    从上面的例子来看,字典就是一类数据结构,我一说字典你就知道是那个用{}表示,里面由k-v键值对的东西,它还具有一些增删改查的方法。但是我一说字典你能知道字典里具体存了哪些内容么?不能,所以我们说对于一个类来说,它具有相同的特征属性和方法。

    而具体的{'name':'eva'}这个字典,它是一个字典,可以使用字典的所有方法,并且里面有了具体的值,它就是字典的一个对象。对象就是已经实实在在存在的某一个具体的个体。

    再举一个其他的例子,通俗一点,比如你现在有一个动物园,你想描述这个动物园,那么动物园里的每一种动物就是一个类,老虎、天鹅、鳄鱼、熊。他们都有相同的属性,比如身高体重出生时间和品种,还有各种动作,比如鳄鱼会游泳,天鹅会飞,老虎会跑,熊会吃。

    但是这些老虎熊啥的都不是具体的某一只,而是一类动物。虽然他们都有身高体重,但是你却没有办法确定这个值是多少。如果这个时候给你一只具体的老虎,而你还没死,那你就能给他量量身高称称体重,这些数值是不是就变成具体的了?那么具体的这一只老虎就是一个具体的实例,也是一个对象。不止这一只,其实每一只具体的老虎都有自己的身高体重,那么每一只老虎都是老虎类的一个对象。

    在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。

    定义一个类

    class Person:   #定义一个人类
        role = 'person'  #人的角色属性都是人
        def __init__(self,name):
            self.name = name  # 每一个角色都有自己的昵称;
            
        def walk(self):  #人都可以走路,也就是有一个走路方法
            print("person is walking...")
    
    
    print(Person.role)  #查看人的role属性
    print(Person.walk)  #引用人的走路方法,注意,这里不是在调用
    egg = Person('egon')  #类名()就等于在执行Person.__init__()
    #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。

    实例化的过程就是类——>对象的过程

    原本我们只有一个Person类,在这个过程中,产生了一个egg对象,有自己具体的名字、攻击力和生命值。

    语法:对象名 = 类名(参数)

    查看调用和方法

    print(egg.name)     #查看属性直接 对象名.属性名
    print(egg.walk())   #调用方法,对象名.方法名()

    self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。

    类属性补充:

    一:我们定义的类的属性到底存到哪里了?有两种方式查看
    dir(类名):查出的是一个名字列表
    类名.__dict__:查出的是一个字典,key为属性名,value为属性值
    二:特殊的类属性
    类名.__name__# 类的名字(字符串)
    类名.__doc__# 类的文档字符串
    类名.__base__# 类的第一个父类(在讲继承时会讲)
    类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
    类名.__dict__# 类的字典属性
    类名.__module__# 类定义所在的模块
    类名.__class__# 实例对应的类(仅新式类中)

    类命名空间与对象、实例命名空间

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

    而类有两种属性:静态属性和动态属性

    • 静态属性就是直接在类中定义的变量
    • 动态属性就是定义在类中的方法

    类的数据属性是共享给所有对象的

    print(id(egg.role))
    print(id(Person.role))

    类的动态属性是绑定到所有对象的

    print(egg.attack)
    print(Person.attack)

    创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

    在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

    软件重用的重要方式除了继承之外还有另外一种方式,即:组合

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

    圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
    这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

    from math import pi
    
    class Circle:
        '''
        定义了一个圆形类;
        提供计算面积(area)和周长(perimeter)的方法
        '''
        def __init__(self,radius):
            self.radius = radius
    
        def area(self):
             return pi * self.radius * self.radius
    
        def perimeter(self):
            return 2 * pi *self.radius
    
    
    circle =  Circle(10) #实例化一个圆
    area1 = circle.area() #计算圆面积
    per1 = circle.perimeter() #计算圆周长
    print(area1,per1) #打印圆面积和周长
    
    class Ring:
        '''
        定义了一个圆环类
        提供圆环的面积和周长的方法
        '''
        def __init__(self,radius_outside,radius_inside):
            self.outsid_circle = Circle(radius_outside)
            self.inside_circle = Circle(radius_inside)
    
        def area(self):
            return self.outsid_circle.area() - self.inside_circle.area()
    
        def perimeter(self):
            return  self.outsid_circle.perimeter() + self.inside_circle.perimeter()
    
    
    ring = Ring(10,5) #实例化一个环形
    print(ring.perimeter()) #计算环形的周长
    print(ring.area()) #计算环形的面积
  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/Wj-Li/p/10864914.html
Copyright © 2011-2022 走看看