【0826 | Day 23】面向对象/类与对象/产生对象/一切皆对象

面向对象

一、面向过程编程 vs 面向对象编程

面向过程编程:

  • 优点:流程化
  • 缺点:可扩展性差

面向对象编程:

  • 优点:可扩展性高
  • 缺点: 编写复杂

类与对象

一、基本介绍

对象:属性/方法的结合体

类:一系列共同的属性和方法(用驼峰体表示)

注意:在程序中,先类后对象,属性用变量表示,方法用函数表示。

#生成对象:类加括号生成对象
class Student()

#赋变量名
stu1 = Student()
stu2 = Student()

#获取属性和方法:通过'.'获取
print(stu1.school)
print(stu2.choose)  #绑定方法

#查看类中的属性和方法
print(Student.__dict__) #属性和方法丢进字典
print(Student.__dict__['school']) #打印oldboy
print(Student.__dict__['choose']) #打印内存地址
Student.choose(123) #类调用加参数

二、两者区别

---> 类

  1. 获取类的属性和方法
    • 通过类.__dict__()获取
  2. 类来调用属性和方法
    • 通过dict[' ']获取 (但比较复杂)
    • 通过类名.属性和函数 获取(传参)(对于类来说,study / choose只是函数)

注意:打印结果为function。

---> 对象

  1. 获取对象的属性和方法
    • 通过对象.__dict__获取 (空字典)
  2. 对象来调用属性和方法
    • 通过对象.属性/方法获取(不传参)(对于对象来说,study/choose是方法)

注意:打印结果为method。

  1. 对象自己的属性和方法
stu1.Student()
stu1.name = 'nick'
stu1.school = 'oldgirl'  #若类要修改Student.school = 'xxx'
print(stu1.__dict__)

#{'name': nick, 'school': oldgirl}
  1. 向对象中添加属性

    • stu1.Student()
      stu1.name = 'nick'

    • __init__方法

      class Student:
          School = 'oldboy'
          def __init__(self,name):
              self.name = name
      

      注意:在对象实例化产生对象时,第一个参数不传参

  2. 属性查找顺序

    • 对象 ---> 类 ---> 没有就报错,例如print(stu1.oldboy)
  3. 产生对象

    stu1.Student('nick')
    stu2.Student('jason')
    
  4. 绑定方法

    • 定义在类内部的方法
    • 如果类调用,就是一个普通函数;如果对象调用,叫对象的绑定方法,第一个参数不需要传入,自动传入

一切皆对象

#类实例化产生对象3
Q = [1, 2, 3]
list.append(Q,5) #list是类,传两个参数

Q = list([1, 2, 3])
Q.append(5) #Q是具体对象,传一个参数

人狗大战

#人狗大战
#定义一个狗类
class Dog:
    type_dog='金毛'
    def __init__(self, name, aggr, hp=100):
        self.name=name
        self.aggr = aggr
        self.hp=hp
    def bite(self, target):
        #当期狗的攻击力:self.aggr
        #人的血量:target.hp
        target.hp-=self.aggr
        print('''
        狗的品种:%s
        %s狗咬了一下%s人,
        人掉血:%s
        人的血量剩余:%s
        '''%(self.type_dog,self.name,target.name, self.aggr,target.hp))
#人类
class Human:
    def __init__(self,name,aggr,hp=100):
        self.name=name
        self.aggr=aggr
        self.hp=hp
    def bite(self,target):
        target.hp-=self.aggr
        print('''
        %s人咬了一下%s狗,
        狗掉血:%s
        狗的血量剩余:%s
        '''%(self.name,target.name,self.aggr,target.hp))


#实例化产生狗对象
# dog1=Dog('旺财',10)
dog1=Dog('旺旺财',10,200)
nick=Human('nick',50)
dog1.bite(nick)
print(nick.hp)
dog1.bite(nick)
print(nick.hp)
nick.bite(dog1)
posted @ 2019-08-26 22:11  fxyadela  阅读(123)  评论(0编辑  收藏  举报