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())

 

posted @ 2018-04-13 19:05  tom2ling  阅读(198)  评论(0编辑  收藏  举报