python3基础17

day17

面向对象编程 Object-Oriented Programming

面向对象三大特征:(***)
封装,继承,多态

什么是对象:
  对象是指现实世界中的物体或实体

什么是面向对象:
  把一切看成(对象(实例)),用各种对象之间的关系来描述事务

对象的特征:
1.对象有很多属性(名词或形容词)
  年龄,姓名,性别...
2.对象又很多行为(动作,动词)
  学习,吃饭,睡觉,踢球,工作...


什么是类
  拥有相同属性和行为的对象分为一组,即为一个类
  类是拥有描述对象的工具,用类可以创建此类的对象(实例)
  
类和对象示意
 车 (类)   -------->> BYD  E6(京A.88888) 实例,对象
            -------->> BYD  X5(京B.00000) 实例,对象
 狗 (类)  ------->  哈士奇(户籍号:00001)
           ------->  导盲犬(户籍号:00002)
 int (类)  --------> 100(对象)
           --------> 200(对象)
#创建对象的工厂
类的创建语句 class语句
  语法:
   class 类名(继承列表):
       '''类文档字符串'''
       实例方法定义
       类变量定义
       类方法定义(@classmethod)
       静态方法定义(@classmethod)
  作用:
   创建一个类
   类用于描述对象的行为和属性
   类用于创建类的一个或多个对象(实例)
  说明:
   类名必须为标识符(与变量名命名规则相同,建议首字母大写)
   类名实质上就是变量,它绑定一个类
  示例见:
   class.py


构造函数
 构造函数调用表达式:
  类名 ([创建传参列表])
  
 作用:
  创建这个类的实例对象,并返回此实例对象的引用关系
 说明:
  实例有自己的作用域和名字空间,可以为该实例添加实例变量
 (也叫属性)
  实例也可以调用类方法和实例方法
  实例可以访问类变量和实例变量 
 示例见:
  class.py
 
class Dog:
    '''创建一个Dog类,此类用于描述
    一种小动物的行为和属性'''
    pass


dog1 = Dog()   #创建Dog类的一个实例 ,自己创建的类型
print(id(dog1))

dog2 = Dog()
print(id(dog2)) #创建Dog类的第二个实例

print('------------------------------')
#对比

lst1 = list()    #系统內建类型
print(id(lst1))

lst2 = list()
print(id(lst2))
 

实例方法()
 语法:
  class 类名(继承列表):
    def 实例方法名(self,形参名1,形参名2,...):
       '方法文档字符串'
        语句块
 作用:
  用于描述一个对象的行为,让此类的全部对象拥有相同的行为

 说明:
  实例方法的实质是函数,是定义在类内的函数
  实例方法至少有一个形参,第一个形参用来绑定调用这个方法的实例,
  一般命名为'self'

实例方法调用语句:
 实例.实例方法名(调用传参)
 或
 类名.实例方法名(实例,调用传参)

 示例见:
 instance_method.py


#此示例示意实例方法的定义和调用
class Dog:
    '''创建一个Dog类,此类用于描述
    一种小动物的行为和属性'''
    def eat(self,food):
        '''此方法用来描述小狗吃东西的行为'''
        print('id为:',id(self),"小狗正在吃",food)
    def sleep(self,hour):
        print("小狗睡了",hour,'小时')
    def play(self,obj):
        print("小狗正在玩",obj)


dog1 = Dog()   #创建一个小狗对象
dog1.eat('骨头')  #self绑定的对象是方法的调用者
                  #self绑定的就是dog1
dog1.sleep(1)
dog1.play('皮球')


dog2 = Dog()
dog2.eat('狗粮') #创建第二个小狗
dog2.sleep(3)
dog2.play('飞盘')

实例属性 atrribute(也叫实例变量)
  每个实例可以有自己的变量用来保存对象自己的数据,称为
  实例变量(也叫属性)
 语法:
  实例.属性名
赋值规则同变量的赋值规则
 首次为属性赋值创建此属性
 再次为属性赋值则改变属性的绑定关系

作用:
 记录每个对象自身的数据

示例见:
 attribute.py

#此示例示意为对象添加实例变量(实例属性)及访问实例变量(实例属性)

class Dog:
    def eat(self,food):
        print(self.color,'的',self.kinds,'正在吃',food)
        self.last_food = food
    def show_last_food(self):
        print(self.color,"的",self.kinds,'上次吃的是',self.last_food)
dog1 = Dog()
dog1.kinds = '京巴' #添加实例属性
dog1.color = '白色' #添加 
dog1.color = '黄色' #修改实例属性绑定关系

dog2 = Dog()  #另一个对象
dog2.kinds = '藏獒'
dog2.color = '棕色'
print(dog1.color,'的',dog1.kinds)
print(dog2.color,'的',dog2.kinds)

dog1.eat('骨头')
dog2.eat('窝头')

dog1.show_last_food()
dog2.show_last_food()


练习一:
定义一个"人"(Human)类
 class Human:
    def set_info(self,name,age,address='不祥'):
        '''此方法用来给人对象添加姓名,年龄,家庭住址属性'''
    def show_info(self):
        '''此处显示人的信息'''

调用如下:
 h1 = Human()
 h1.set_info('小张',20,'北京东城区')
 h2 = Human()
 h2.set_info('小李',18)
 h1.show_info()
 h2.show_info()

class Human:
    def set_info(self,name,age,address='不祥'):
        #函数内所有的方法在实例方法中都可以使用
        '''此方法用来给人对象添加姓名,年龄,家庭住址属性'''
        self.name = name
        self.age = age
        self.address = address

    def show_info(self):
        '''此处显示人的信息'''
        print('姓名是:',self.name,'年龄是:',self.age,'住址是:',self.address)


h1 = Human()
h1.set_info('小张',20,'北京东城区')
h2 = Human()
h2.set_info('小李',18)
h1.show_info()
h2.show_info()


del语句
 可以删除对象(实例)的属性
 
 语法:
  del 对象.实例变量名

 示例:
 class Dog:
     pass
dog1 = Dog()
dog1.color = '白色'
print(dog1.color)   #白色
del dog1.color    #删除属性
print(dog1.color)  #AttributeError属性错误


del语句小结:
1.删除变量  del name
2.删除列表中的元素 del L[1],del L[::2]
3.删除字典的键   del d['name']
4.删除对象的属性  del dog.color


初始化方法
 作用:
  对新创建的对象添加属性

 语法格式:
  class 类名(继承列表):
      def __init__(self,[形参列表]):
          语句块
 注:[]代表其中的内容可以省略

 说明:
 1.初始化方法名必须为'__init__'不可改变
 2.初始化方法会在构造函数创建实例后自动调用,且实例自身通过一个  参数self传入__init__方法
 3.构造函数的实参将通过__init__方法的参数列表传入到__init__   方法中
 4.初始化方法如果需要return语句返回,则只能返回None

 示例见:
  init_method.py

#此示例示意初始化方法的定义,及初始化方法对新建对象添加属性

class Car:
     '''小汽车类'''
     def __init__(self, c, b, m):
         self.color = c  #颜色
         self.brand = b  #品牌
         self.model = m  #形号
         print("初始化方法被调用")
     def run(self,speed):
         print(self.color, '的', self.brand,self.model,
              '正在以',speed,'公里/小时的速度行驶')


a4 = Car('红色','奥迪','a4')  #构造函数
a4.run(199)

#调用时直接传参利用初始化方法,为对象添加属性


t1 = Car('蓝色','TESLA','Model S')
t1.run(230)

练习二:
写一个Student类,此类创建的对象有三个属性:
 姓名,年龄,成绩
(1)用初始化方法为该类添加上述三个属性
(2)添加set_score()方法能为对象修改学生成绩
(3)添加show_info()方法,打印学生信息
如:
 
class Student:
    def __init__(self,name,age,score=0):
        self.name = name
        self.age = age
        self.score = score
        #self.name,self.age,self.score = name,age,score #序列赋值
        #name,age,score非全局变量,非局部变量,为对象自己的变量

    def set_score(self,score):
        if 0<= score <=100:
            self.score = score
    def show_info(self):
        print(self.name, self.age, '岁,成绩:',self.score)
L = []
L.append(Student('小张',20,100))
L.append(Student('小李',18,95))
L.append(Student('小魏',8))
print(L)
L[2].set_score(70)
for obj in L:
    obj.show_info() 

析构方法
 class 类名(继承列表):
    def __del__(self):
         语句块
 形参列表只能写self
 析构方法在对象被销毁时被自动调用
 python语言建议不要在对象销毁时做任何事情,因为销毁时间难以确定

示例见:
 del_method.py

class Car:
     #在对象创建之后被调用
    def __init__(self,info):
        self.info = info
        print('汽车对象',info,'被创建')

     #在删除变量之前会执行,验证对象什么时候被销毁
    def __del__(self):
        print('汽车对象',slef.info,'被销毁')

c1 = Car('BYD E6')
c1 = None   #改变对象的绑定关系可以释放BYD E6对象
del c1      #删除变量,释放对象
L = []
L.append(Car('汽车1'))    
L.append(Car('汽车2'))
L.append(Car('汽车3'))   
del L       #释放列表
input('请输入回车键继续执行程序:')
print('程序退出')


预置实例属性
 __dict__属性
 __dict__属性绑定一个存储此实例自身变量字典

示例:
 class Dog:
    pass
 dog1 = Dog()
 print(dog1.__dict__)
 #{}
 dog1.color = '白色'
 print(dog1.__dict__)
 #{'color':'白色'}
 dog1.kind = '京巴'
 print(dog1.__dict__)
 #{'color':'白色','kinds':'京巴'}


__class__属性
'__class__'属性绑定创建此实例的类

作用:
 可以借助此属性来访问创建此实例的类

示例:
class Dog:
    pass
dog1 = Dog()
print(dog1.__class__)
dog2 = dog1.__class__()
print(dog2.__class__)

#Dog绑定的是一个类

用于类(对象/实例)的函数:

 isinstance(obj, class_or_tuple)返回这个对象obj是否是某个类的对象或者某些类中的一个类的对象
 ,如果是则返回True,否则返回False

 type(obj)  返回对象的类型

class Dog:
    pass
dog1 = Dog()
isinstance(dog1,int)  #False
isinstance(dog1,Dog)  #True


isinstance(3.14,(int,tuple,str))  #False
isinstance(3.14,(int,str,float))  #True

type(3.14)('123.455')   #True
type(dog1) 等同于 dog1.__class__


练习三:
面向对象的综合示例:
  有两个人:
    属性
     1.姓名:张三,年龄:35岁
     2.姓名:李四,年龄:8岁
    行为:
     1.教别人学东西  teach
     2.工作赚钱   work
     3.借钱   borrow
   
 事情:
  张三 教 李四 学 pyhton
  李四 教 张三 学 王者荣耀
  张三 上班赚了 1000 元钱
  李四 向 张三 借了 200 元钱
  35 岁的 张三 有钱 800元,它学会的技能: 王者荣耀
  8 岁的 李四 有钱 200元,它学会的技能: python

class Human:
    def __init__(self,n,a):
        self.name = n    #姓名
        self.age = a   #年龄
        self.money = 0   #钱数为0
        self.skill = []  #技能列表

    def teach(self,other,skill):
        print(self.name,'教',other.name,'学',skill)
        other.skill.append(skill)   #让other添加技能

    def work(self,m):
        print(self.name,'上班赚了',m,'元钱')
        self.money += m

    def borrow(self,other,m):
        if other.money > m:
            print(self.name,'向',other.name,'借',m,'元钱')
            other.money -= m
            self.money += m
        else:
            print(other.name,'没有借钱给',self.name)
            
    def show_info(self):
        print(self.age,'岁的',self.name,'有钱',self.money,
               '元,它学会的技能:',
             ','.join(self.skill))


zhang3 = Human('张三',35)
li4 = Human('李四',8)
#张三 教 李四 学 pyhton
zhang3.teach(li4,'python')
#   李四 教 张三 学 王者荣耀
li4.teach(zhang3,'王者荣耀')
#   张三 上班赚了 1000 元钱
zhang3.work(1000)
#   李四 向 张三 借了 200 元钱
li4.borrow(zhang3,200)
#   35 岁的 张三 有钱 800元,它学会的技能: 王者荣耀
zhang3.show_info()
#   8 岁的 李四 有钱 200元,它学会的技能: python
li4.show_info()

课后练习:
1.看懂全部面向对象的综合示例:
2.将学生信息管理程序,原来由字典保存每个学生的信息,现改为用对象来保存学生信息
要求:
 用student类来描述,将student类写在独立模块:
 student.py中


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值