zoukankan      html  css  js  c++  java
  • python之路--day?--初始面向对象

    面向过程vs面向对象

    面向过程
    优点:极大的降低了写程序的复杂度,只要顺着要执行的步骤,堆叠代码即可。
    缺点:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。

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

    面向对象
    优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
    缺点:可控性差,无法像面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏某一人物参数的修改极有可能导致阴霾的技能出现,一刀砍死3个人,这个游戏就失去了平衡。

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

    1. 类

    1.1 类的定义格式

    class Person:        #定义类名,命名规则:首字母大写
        role = “中国人”        # 属性 --- 静态属性
        def __init__(self,参数):
            self.参数名 = 参数
        def walk(self):        # 方法 --- 动态属性
            print("person is walkiing…")
    
    
    print(Person.role)        # 查看人的role属性
    print(Person.walk)        # 引用走路的方法
    

    我们查看类的属性的方法:

    1. dir(类名):查出一个名字列表
    2. 类名.dict: 查出的是一个字典,key为属性名,value为属性值

    PS: 特殊的类的对象

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

    1.2 实例化

    实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征

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

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

    bit = Person('bit')        # 类名()就等于执行Person.__init__()
    print(bit)                 #返回一个对象,这个对象类似字典,存放着属于这个类的一些属性和方法。

    1.3 查看属性&调用方法

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

    2. 对象

    对象是关于类而实际存在的一个例子,即实例
    对象/实例只有一种作用:属性引用

    bit = Person('bit')
    print(bit.name)

    也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,即动态属性

    print(bit.walk)

    3. 类命名空间与对象、实例的命名空间

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

    • 静态属性:就是直接在类中定义的变量
    • 动态属性: 就是定义在类中的方法
      类的所有属性是共享给所有对象的
      类的动态属性是绑定到所有对象的

    创建一个对象/实例就会创建一个相对的名称空间,存放属性
    在obj.name会先从自己的命名空间找name,找不到则在类中找,类找不到找父类,最后找不到抛出异常

    小结

    # -*- coding:utf-8 -*-
    __author__ = '8192bit'
    class Person:           # 类名首字母大写
        role = '中国人'        # 属性     静态属性
        def __init__(self,name,life_value,agg,money):
            self.name = name
            self.life_value = life_value
            self.agg = agg
            self.money = money
    
        def attack(self,object):   # 方法     动态属性
                object.life_value = object.life_value - self.agg
    
    class Dog:
        def __init__(self,name,beer,life_value,agg):
            self.name = name
            self.beer = beer
            self.life_value = life_value
            self.agg = agg
    
        def bite(self,person):
            person.life_value = person.life_value - self.agg
    class Weapon:
        def __init__(self,name,price,agg,life_vaule,attack_force):
            self.name = name
            self.price = price
            self.agg = agg
            self.life_vaule = life_vaule
            self.attack_force = attack_force
    
        def update(self,person):
            person.money = person.money - self.price
            person.agg = person.agg + self.agg
            self.life_vaule -= 1
    
        def kill(self,obj):
            obj.life_value = obj.life_value - self.attack_force
            self.life_vaule -= 2
    
    
    egg = Person('egg',5000,50,1000)
    alex = Person('alex',250,5,1000)
    erha = Dog('luhu','erha',20000,100)
    egg.role = '狗'              # 可自行修改,修改后会在自己的命名空间内多出一个role属性
    Person.role = 'everybody'    # 修改全局所有的role参数
    print(egg.life_value)       # 攻击之前的life_value
    alex.attack(egg)            # alex攻击了egg
    print(egg.life_value)       # 攻击之后的life_value
    print(egg.role)             # 结果是狗,即使修改全局,也影响不到egg的命名空间内的role属性
    
    print(alex.agg)             # alex的攻击力
    print(alex.life_value)      # egg攻击前,alex的生命值
    egg.attack(alex)            # egg攻击alex
    print(alex.life_value)      # egg攻击后,erha攻击前,alex的生命值
    erha.bite(alex)             # erha攻击alex
    print(alex.life_value)      # egg攻击后,erha攻击后,alex的生命值
    

    感谢

    感谢eval美女倾囊相授
    感谢为知笔记





  • 相关阅读:
    Layui:数据表格渲染二级表头
    Layui:数据表格表头参数
    Layui:数据表格基础参数
    Layui:数据表格的渲染
    Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存(转发同上)
    Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询(转发同上)
    Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射(转发同上)
    Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql(转发同上)
    Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析(转发同上)
    Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发(转发同上)
  • 原文地址:https://www.cnblogs.com/8192bit/p/7339851.html
Copyright © 2011-2022 走看看