Python 基础第十六---十九天(面向对象初识)

Posted tom2ling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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())

 









以上是关于Python 基础第十六---十九天(面向对象初识)的主要内容,如果未能解决你的问题,请参考以下文章

马哥教育第十六天至十九天学习总结

python第十九天——感冒中

二刷Java基础第十五天——初识API

Python 基础学习第十六天

PHP操作MYSQL数据库(10.11 第十九天)

Python 基础学习第十六天