zoukankan      html  css  js  c++  java
  • python之路 面向对象(一)

    面向过程vs面向对象

    面向过程的核心是过程,是解决问题的步骤。

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

    缺点:一套程序解决一个问题,牵一发动全身。

    面向对象的核心是对象。

    优点:解决了程序的扩展性,对某一个单一对象的修改,会映射到整个体系中。

    缺点:可控性差,无法向面向过程一样可以很精准的预测到结果,面向对象程序一旦开始就由对象之间的交互解决问题,无法预测结果。

    类和对象(实例)


    python中一切皆对象,类型的本质就是类,包括字典,列表,数字,字符串等。

    在python中,用变量表示特征,用函数表示方法,具有相同特征和方法的一类事物即使“类”,对象就是类中具体的一个。


    定义一个类

    class Class_name:  #class关键字,类名手字母大写,后跟冒号
        pass

    声明类

    class Person:
        role = "person"#属性 静态属性
        def walk(self):
            print("person is walking...")#方法 动态属性

    类的两种作用:属性引用和实例化

    属性引用(类名. 属性)

    class Person:
        role = "person"#属性 静态属性
        def walk(self):
            print("person is walking...")#方法 动态属性
    print(Person.role)#查看role的属性
    print (Person.walk)#引用人的walk方法

    实例化: 类名加括号就是实例化,自动触发__inti__方法的运行,可以使用它来为每个实例定制自己的特征。

    class Person:
        role = "person"#属性 静态属性
        def __init__(self,name):
            self.name = name 
        def walk(self):
            print("person is walking...")#方法 动态属性
    print(Person.role)
    print (Person.walk)

    实例化就是类产生对象的过程。

    特殊的类属性

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

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

    class Person:
        '''定义一个关于人的类'''
        role = "person"#属性 静态属性
        def __init__(self,name,aggr,life_value):
            self.name = name
            self.aggr = aggr
            self.life_value = life_value
    
        def attack(self,dog):
            dog.life_value -= self.aggr
    
    egg = Person("egon",100,1000)
    # 属性引用
    print(egg.name)
    print(egg.aggr)
    print(egg.life_value)

    用函数来解释这个类:

    def Person(*args,**kwargs):
        self = {}
        def __init__(name,aggr,life_value):
    
            self["name"] = name
            self["aggr"] = aggr
            self["life_value"] = life_value
            return self
        return __init__(*args,**kwargs)
    egg = Person("egon",10,20)
    print(egg)

    定义及调用的固定模式

    class 类名:
        def __init__(self,参数1,参数2):
            self.对象的属性1 = 参数1
            self.对象的属性2 = 参数2
    
        def 方法名(self):pass
    
        def 方法名2(self):pass
    
    对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                      #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                      #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                      #结果返回一个对象
    对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
    对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可
    
    小结
    固定模式

    对象交互:

    class Person:#定义一个人类
        role = "中国人"
        def __init__(self,name,life_value,aggr):
            self.name = name
            self.life_value = life_value
            self.aggr = aggr
        def attack(self,dog):
            dog.life_value -= self.aggr
    class Dog:#定义一个够类
        def __init__(self,name,life_value,aggr):
            self.name = name
            self.life_value = life_value
            self.aggr = aggr
        def bite(self,person):
            person.life_value -= self.aggr
    egg = Person("egon",500,50)
    dog = Dog("泰迪",20000,500)
    # egon攻击狗,狗的生命值少了50
    print(dog.life_value)
    egg.attack(dog)
    print(dog.life_value)
    # 狗咬egon,egon的生命值少了66
    print(egg.life_value)
    dog.bite(egg)
    print(egg.life_value)
    # egg 有了200块钱买装备
    egg.money  = 200
    
    class Weapon:#定义一个武器类
        def __init__(self,name,price,aggr,life_value,attack_force):
            self.name = name
            self.price = price
            self.life_value = life_value#生命加成
            self.attack_force = attack_force#攻击力
            self.aggr = aggr#伤害加成
        def Update(self,person):#带装备
            person.money -= self.price
            person.life_value += self.life_value
            person.aggr += self.aggr
        def Kill(self,obj):#obj代表被攻击对象   大招
            obj.life_value -= self.attack_force
    打狗棍 = Weapon("打狗棍",199,50,50,10000)
    if egg.money > 打狗棍.price:
        打狗棍.Update(egg)
        egg.Weapon = 打狗棍
    #egon的攻击力和生命值都增加了50
    print(dog.life_value)
    print(egg.life_value)
    egg.attack(dog)
    print(dog.life_value)
    #egon放大招了,狗的生命值减少10000
    print(dog.life_value)
    print(egg.life_value)
    egg.Weapon.Kill(dog)
    print(dog.life_value)
    人狗大战

    类命名空间与实例命名空间

    创建一个类的时候就会创建一个类的名称空间

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

    动态属性就是定义在类中的方法

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

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

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

  • 相关阅读:
    哈哈哈!网站本地更新功能全部实现拉!!!发贴庆祝!
    用最愚蠢的方法实现了CVC 数据同步功能...
    我的一个异步操作UML
    11月10日
    The 7 Most Useful Data Analysis Methods and Techniques
    统计学中的各种检验scipy.stats和statsmodels.stats的使用
    TimscaleDB 2.0发布,现在是分布式多节点
    Console Win32 API Native Methods Helper
    SocketAsyncEventArgs Socket Echo Server
    bytes array handling compare
  • 原文地址:https://www.cnblogs.com/shengzhongqiu/p/7341009.html
Copyright © 2011-2022 走看看