zoukankan      html  css  js  c++  java
  • 面向对象初识

    声明一个类

    '''
    class 类名:
        '类的文档字符串'
        类体
    '''
    
    #我们创建一个类
    class Data:
        pass

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

    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)  #引用人的走路方法,注意,这里不是在调用

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

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

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

    egg = Person('egon')  #类名()就等于在执行Person.__init__()
    #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
    #你可以偷偷的理解:egg = {'name':'egon','walk':walk}

    查看属性&调用方法

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

    关于self

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

    类属性的补充

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

    对象的相关知识

    回到咱们的人狗大战:现在我们需要对我们的类做出一点点改变
    人类除了可以走路之外,还应该具备一些攻击技能。

    class Person:  # 定义一个人类
        role = 'person'  # 人的角色属性都是人
    
        def __init__(self, name, aggressivity, life_value):
            self.name = name  # 每一个角色都有自己的昵称;
            self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
            self.life_value = life_value  # 每一个角色都有自己的生命值;
    
        def attack(self,dog):  
            # 人可以攻击狗,这里的狗也是一个对象。
            # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
            dog.life_value -= self.aggressivit

    对象是关于类而实际存在的一个例子,即实例

    对象/实例只有一种作用:属性引用

    egg = Person('egon',10,1000)
    print(egg.name)
    print(egg.aggressivity)
    print(egg.life_value)

    当然了,你也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,我们也管它叫动态属性。
    引用动态属性并不是执行这个方法,要想调用方法和调用函数是一样的,都需要在后面加上括号

    print(egg.attack)

    我知道在类里说,你可能还有好多地方不能理解。那我们就用函数来解释一下这个类呀,对象呀到底是个啥,你偷偷的用这个理解就好了,不要告诉别人

    def Person(*args,**kwargs):
        self = {}
        def attack(self,dog):
            dog['life_value'] -= self['aggressivity']
    
        def __init__(name,aggressivity,life_value):
            self['name'] = name
            self['aggressivity'] = aggressivity
            self['life_value'] = life_value
            self['attack'] = attack
    
        __init__(*args,**kwargs)
        return self
    
    egg = Person('egon',78,10)
    print(egg['name'])
    帮你了解面向对象

    面向对象小结——定义及调用的固定模式

    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   #查看对象的属性,直接用 对象名.属性名 即可
    对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

    对象之间的交互

    现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人。
    现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法。
    有了狗类,我们还要实例化一只实实在在的狗出来。
    然后人和狗就可以打架了。现在我们就来让他们打一架吧!

    class Dog:  # 定义一个狗类
        role = 'dog'  # 狗的角色属性都是狗
    
        def __init__(self, name, breed, aggressivity, life_value):
            self.name = name  # 每一只狗都有自己的昵称;
            self.breed = breed  # 每一只狗都有自己的品种;
            self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
            self.life_value = life_value  # 每一只狗都有自己的生命值;
    
        def bite(self,people):
            # 狗可以咬人,这里的狗也是一个对象。
            # 狗咬人,那么人的生命值就会根据狗的攻击力而下降
         dog.life_value -= self.aggressivit

    实例化一只实实在在的二哈

    ha2 = Dog('二愣子','哈士奇',10,1000)  #创造了一只实实在在的狗ha2

    交互 egon打ha2一下

    print(ha2.life_value)         #看看ha2的生命值
    egg.attack(ha2)               #egg打了ha2一下
    print(ha2.life_value)         #ha2掉了10点血

    完整的代码:

    class Person:  # 定义一个人类
        role = 'person'  # 人的角色属性都是人
    
        def __init__(self, name, aggressivity, life_value):
            self.name = name  # 每一个角色都有自己的昵称;
            self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
            self.life_value = life_value  # 每一个角色都有自己的生命值;
    
        def attack(self,dog):
            # 人可以攻击狗,这里的狗也是一个对象。
            # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
            dog.life_value -= self.aggressivity
    
    class Dog:  # 定义一个狗类
        role = 'dog'  # 狗的角色属性都是狗
    
        def __init__(self, name, breed, aggressivity, life_value):
            self.name = name  # 每一只狗都有自己的昵称;
            self.breed = breed  # 每一只狗都有自己的品种;
            self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
            self.life_value = life_value  # 每一只狗都有自己的生命值;
    
        def bite(self,people):
            # 狗可以咬人,这里的狗也是一个对象。
            # 狗咬人,那么人的生命值就会根据狗的攻击力而下降
            people.life_value -= self.aggressivity
    
    egg = Person('egon',10,1000)  #创造了一个实实在在的人egg
    ha2 = Dog('二愣子','哈士奇',10,1000)  #创造了一只实实在在的狗ha2
    print(ha2.life_value)         #看看ha2的生命值
    egg.attack(ha2)               #egg打了ha2一下
    print(ha2.life_value)         #ha2掉了10点血

    面向对象的组合用法

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

    (一个类对象的属性  是 另一个类的对象,则说明这两个类是组合关系)

    class Weapon:
        def prick(self, obj):  # 这是该装备的主动技能,扎死对方
            obj.life_value -= 500  # 假设攻击力是500
    
    class Person:  # 定义一个人类
        role = 'person'  # 人的角色属性都是人
    
        def __init__(self, name):
            self.name = name  # 每一个角色都有自己的昵称;
            self.weapon = Weapon()  # 给角色绑定一个武器;
            
    egg = Person('egon')
    egg.weapon.prick() 
    #egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法
    from math import pi
    class Circule:
        def __init__(self,r):
            self.r=r
        def area(self):
            return self.r**2*pi
        def perimeter(self):
            return self.r*2*pi
    #上面这个类是一个圆类,实例化后,可以选择方法输出面积或者周长
    #c=Circule(5)    #实例化(定义一个半径为5的圆)
    #c.area()        #对象.方法  调用方法,c的面积
    #c.perimeter()        #对象.方法  调用方法,c的周长
    class Ring:
        def __init__(self,outer,inner):
            self.outer=Circule(outer)   #组合:此属性的值为上一个类的对象(Circule(outer)的意思是在上一个类里实例化一个半径为outer的圆,就可以和上一个函数建立关联)
            self.inner=Circule(inner)
        def area(self):
            return self.outer.area()-self.inner.area()
        def perimeter(self):
            return self.outer.perimeter()+self.inner.perimeter()
    c=Ring(2,1)
    print(c.area())
    圆环实例
    class Teacher:
        def __init__(self,name,job,birth):
            self.name=name
            self.job=job
            self.birth=birth
    # alex=Teacher("alex","python","1999/9/9")
    # print(alex.name)
    class Birth:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    birthday=Birth(1938,3,8)
    alex=Teacher("alex","python",birthday)  #实例化传参时,(birthday=Birth(1938,3,8))把另一个类的对象,传进去,进入后,把这个对象赋值给属性
    print(alex.birth.year)
    实例化老师
  • 相关阅读:
    日期格式设置
    ccnet编译后dll被删除
    GridView使用
    项目发布命令
    虚拟内存技术原理和使用方法
    一种可以穿透还原卡和还原软件的代码
    DataList控件也玩分页
    如何在 Windows XP 或 Windows Server 2003 的应用程序开发中实现 URL 验证
    vc 6.0中开发驱动设备程序配置方法
    通过CreateFile来读取磁盘扇区的方法
  • 原文地址:https://www.cnblogs.com/pygg/p/8509657.html
Copyright © 2011-2022 走看看