zoukankan      html  css  js  c++  java
  • Python 基础第十六---十九天(面向对象初识)

    面向对象初识

    类的概念:具有相同属性和技能的一类事物

    对象的概念:对一个类的具体描述

    使用面向对象的好处:

    1.使得代码之间的角色关系更加明确

    2.增强了代码的可扩展性

    3.规范了对象的属性和性能

    面向对象的特点:

    结局的不确定性

    类的内部各个部分说明和结构:

    class 类名(首字母大写):

      #引用静态变量

         #1.类名.__dict__['静态变量名'] #可以查看,但是不能删改

         #2.类名.静态变量名  #直接就可以访问,可以删改

            #删除一个静态变量:del 类名.静态变量名

      #引用动态变量

          #1.类名.方法名  #查看这个方法的内存地址

          #2.类名.方法名(实参)  #调用了这个方法,必须传一个 实参,这个实参传给了self

        #创造一个对象  -示例化 

          #产生一个实例(对象)的过程

          #格式:  对象 = 类名()

    下面写一个简单的类,跟上面的概念进行对应:

    class Person:
        role = 'person'
        def __init__(self,name,sex,hp,ad):
            self.name = name
            self.sex = sex
            self.hp = hp
            self.ad = ad
        def attack(self):
            print('%s发起了一次攻击'%self.name)
    
    alex = Person('a_sb','不详',1,5)
    boss_jin = Person('金老板','',20,50)

    类中实例化的过程:

    1.创造一个实例,将会作为一个实际参数

    2.自动触发一个__list__方法,并且把实例以参考的形式传递给__init__方法中的self形参

    3.执行完__init__方法之后的,会将self自动返回给alex

    __init__方法:初始化方法,给一个对象添加一些基础属性的方法,一般情况不是self的赋值

    对象:

    1.在类的内部self是本的一个对象

    2.在类的外部,每个对象都对应着一个名字,这个对象指向一个对象的内存空间

    属性的调用:(两种调用方式)

    1.对象名.属性名

    2.对象名.__dict__['属性名']

    方法的调用:(两种方式)

    1.类名.方法名(对象名)  # 那么方法中的self参数就指向这个对象

    2.对象名.方法名()  # 这样写 相当于  方法中的self参数直接指向这个对象

    面向对象的传参和交互输出

    class Person:
        role = 'person'
        def __init__(self,name,sex,hp,ad):
            self.name = name
            self.sex = sex
            self.hp = hp
            self.ad = ad
        
        def attack(self,user):
            user.hp -= self.ad
            print('%s 发起一次攻击%s,%s掉了%s点血' %(self.name,user.name,user.name,self.ad))
    
    class Dog:
       def __init__(self,name,kind,hp,ad):
            self.name = name
            self.sex = kind
            self.hp = hp
            self.ad = ad
            
       def bite(self,ani):
            print('%s 发起一次攻击%s,%s掉了%s点血' %(self.name,ani.name,ani.name,self.ad))
            ani.hp -= self.ad
            
    tom = Person('塔姆','',60,45)
    teddy = Dog('笨笨','teddy',50,10)
    
    tom.attack(teddy)
    teddy.bite(tom)
    
    print(tom.hp)
    print(teddy.hp)

    结果:

    塔姆 发起一次攻击笨笨,笨笨掉了45点血
    笨笨 发起一次攻击塔姆,塔姆掉了10点血
    50
    5

    命名空间和作用域

    总结:

    对象属性是独有的,静态属性和方法是共享的

    对象使用的名字:先找自己的内存空间中的,再找类的内存空间中的

    类名.静态变量名:对于静态属性的修改,应该使类名直接修改

    例子代码:

    展示现在一共有多少钱?

    本例中 money为不可变数据类型,self.money相当于在对象内存空间中创建了一个叫money的属性,并不能引用

    类内存空间中的静态变量

    class Person:
        money = 0def __init__(self,name):
            self.name = name
        def work(self):
            print(self.name,'工作,赚了1000块钱')
            self.money += 1000
    
    father = Person('father')
    mother = Person('mother')
    mother.work()
    father.work()
    print(Person.money)

    变成可变数据类型,就能够对money进行索引引用,由于是可变类型,对象空间不能完成创建,只能引用类空间的money

    class Person:
        money = [0]
        def __init__(self,name):
            self.name = name
        def work(self):
            print(self.name,'工作,赚了1000块钱')
            self.money[0] += 1000
    
    father = Person('father')
    mother = Person('mother')
    mother.work()
    father.work()
    print(Person.money)

    面向对象的组合用法

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

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

    下面例:

    class Person:
        def __init__(self,name,sex,hp,ad):
            self.name = name
            self.sex = sex
            self.hp = hp
            self.ad = ad
            self.money = 0
        def attack(self.dog):
            dog.hp -= self.ad
            print(%s攻击了%s,%s掉了%s点血' %(self.name,d.name,d.name,self.ad))
        def pay(self):
            money = int(input('请输入您要充值的金额: '))
            self.money += money 
            print("余额是:%s" %self.money)
         def wear(self,weapon):
             #weapon 为Weapon类的引用的形参
            if self.money >= weapon.price
                self.weapon = weapon  #组合 给人装备了武器
                self.money -= weapon.price
                print('购买成功,您已经顺利装备了 %s' %weapon.name)
            else:
                print('余额不足,请充值')
          def  attack_with_weapon(self,dog):
                if 'weapon' in self._dict_:
                     self.weapon.skill(dog)
                else:
                     print('请先装备武器')
    class Dog:
           def __init__(self,name,kind,hp,ad):
                self.name = name
                self.kind = kind
                self.hp = hp
                self.ad = ad
           def bit(self,p):
                p.hp -= self.ad
                print('%s咬了%s一口,%s掉了%s点血' % (self.name, p.name, p.name, self.ad))
    class Weapon:
        def __init__(self,name,price,ad,level):
            self.name = name
            self.price = price
            self.level = level
            self.ad = ad * self.level
    
        def skill(self,dog):
            dog.hp -= self.ad
            print('%s受到了%s的伤害,%s掉了%s点血'%(dog.name,self.name,dog.name,self.ad))

    例2 ,通过对圆柱进行计算,实现类的组合

    from math import pi
    
    class In_circle:
        def __init__(self,r):
            self.r = r
        def area(self):
            return pi*self.r ** 2
        def perimeter(self):
            return pi*self.r * 2
    
    class Ring:
        def __init__(self,big_r,small_r):
            self.big_r = In_circle(big_r) #一个类中以另外一个类的对象作为属性
            self.small_r = In_circle(mall_r)#一个类中以另外一个类的对象作为属性
    def n_area(self):
       return self.big_r.area - self.small_r.area

    def n_perimeter(self):

       return self.big_r.perimeter + self.small_r.perimeter
    r2 = Ring(8,3) 
    print(r2.n_area())
    print(r2.n_perimeter())
  • 相关阅读:
    和为S的两个数字
    和为S的连续正数序列
    两个链表的第一个公共结点
    删除链表中重复的结点
    常用开发工具的安装(JDK、IDEA、Tomcat、Maven、Mysql和Nodepad++)——实习日志7.10
    蓄水池取样(转)
    prepare statement
    ProxySQL Getting started
    架构收录
    服务开机自启动
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8782996.html
Copyright © 2011-2022 走看看