基础 day17

day17笔记

 

面向对象编程: Object-Oriented Programing

 

什么是对象:

  对象是指现实中的物体或实体

 

什么是面向对象

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

 

对象都有什么特征:

  对象有很多属性(名词)

    姓名,性别, 年龄, ...

  对象有很多行为(动作,动词)

    学习,吃饭,睡觉,工作, ....

 

示意:

  (类)  ------>> BYD E6 (京A.88888) (实例,对象)

        \

         \----->> BWM X5 (京B.66666) (对象)

 

 

  (类)  ------>> 京巴 (户籍号: 000001)

        \

         \----->> 导盲犬 (户籍号: 000002)

 

  int(类) ------>> 100  (对象,实例)

         \

          \----->> 200 (对象,实例)

 

什么是类:

  拥有相同属性和行为的对象分为一组,即为一个类

  类是用来描述对象的工具,用类可以创建此类的对象(实例)

 

类的创建语句:

  class 语句

  语法:

    class 类名(继承列表):

        ''' 类文档字符串'''

        实例方法定义

        类变量定义

        类方法定义(@classmethod)

        静态方法定义(@staticmethod)

  作用:

    创建一个类

    用于描述对象的行为和属性

    用于创建此类的一个或多个同类对象(实例)

  说明:

    继承列表可以省略,省略继承列表表示类继承自object

    类名必须为标识符

    类名实质上是变量,它绑定一个类

  示例:

   # 此示例示意定义最简单一个类

class Dog:

    '''这个类用于描述一种小动物的行为和属性'''

    pass

 

dog1 = Dog()  # 创建一个新的Dog类的对象

print(id(dog1))  # 打印这个对象的id

 

dog2 = Dog()  # 创建另一个Dog类的对象

print(id(dog2))

 

# 对比

lst1 = list()  # 创建一个空列表

print(id(lst1))

 

lst2 = list()  # 创建另一个空列表

print(id(lst2))

 

lst1.append(100)

lst2.append(200)

# dog1.append(10000)  # 只要在类中添加方法就可以实现此操作

# dog2.append(20000)

 

 

    

 

构造函数:

  构造函数调用表达式:

    类名([创建传参列表])

  作用:

    创建这个类的实例对象,并返回此实例对象的引用关系

 

实例说明:

  1. 实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性)

  2. 实例可以调用类方法和实例方法

  3. 实例可以访问类变量和实例变量

 

 

 

 

实例方法(method):

  语法:

    class 类名(继承列表):

        def 实例方法(self, 形参1, 形参2, ...):

            '''方法的文档字符串'''

            语句块

  作用:

    用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为

  说明:

    实例方法的实质是函数,是定义在类内的函数

    实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为'self'

 

实例方法的调用语法:

  实例.实例方法名(调用传参)

  

  类名.实例方法名(实例, 调用传参)

 

示例:

 

    # 此示例示意定义Dog类,并让Dog创建的对象有相同的行为

# 吃,睡,玩

 

class Dog:

    def eat(self, food):

        print('id为', id(self), "的小狗正在吃", food)

 

 

dog1 = Dog()  # 创建一个新的Dog类的对象

print("dog1的id", id(dog1))

dog1.eat('骨头')

 

 

dog2 = Dog()

print("dog2的id", id(dog2))

dog2.eat('包子')

 

 

 

实例属性 attribute (也叫实例变量)

  每个实例可以用自己的变量,称为实例变量(也叫属性)

 

  使用语法:

    实例.属性名

  属性的赋值规则:

    1. 首次为属性赋值则创建此属性

    2. 再次为属性赋值则改变属性的绑定关系

  作用:

    记录每个对象自身的数据

  示例:

    # 此示例示意为每个对象添加实例属性,并通过对象的方法等访问

 

class Dog:

    def infos(self):

        print(self.color, '的', self.kinds)

 

    def eat(self, food):

        '''

        Dog类型的对象吃东西时,用food 属性记住

        此对象吃的是什么

        '''

        print(self.color, '的', self.kinds,

              '正在吃', food)

        self.food = food

 

    def food_info(self):

        print(self.color, '的', self.kinds,

            '上次吃的是', self.food)

dog1 = Dog()

dog1.kinds = '京巴'  # 为dog1绑定的Dog对象添加kinds属性

dog1.color = '白色'  # 创建color实例变量

dog1.color = '黄色'  # 改变实例变量color的绑定关系

 

dog2 = Dog()  # 另一个对象

dog2.kinds = '导盲犬'

dog2.color = '黑色'

 

dog1.infos()

dog2.infos()

# print(dog1.color, '的', dog1.kinds)  # 获取属性的数据

# print(dog2.color, '的', dog2.kinds)

 

dog1.eat('骨头')

dog1.food_info()

 

# dog2.food_info()  # dog2没有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()  # 小张 今年 20 岁 家庭住址: 北京市朝阳区

  h2.show_info()  # 小李 今年 18 岁 家庭住址: 不详

 

 

答:

class Human:

    def set_info(self, n, a, addr='不详'):

        '''此方法为'人', 添加:姓名,年龄,家庭住址属性'''

        self.name = n

        self.age = a

        self.address = addr

 

    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()  # 小张 今年 20 岁 家庭住址: 北京市朝阳区

h2.show_info()  # 小李 今年 18 岁 家庭住址: 不详

 

 

 

 

 

删除属性

  del 语句

  语法:

    del 对象.属性名

 

示例:

  class Dog:

      pass

  dog1 = Dog()

  dog1.color = '白色'  # 添加属性

  del dog1.color 删除属性

 

del 语句总结:

    1) 删除变量 del a

    2) 删除列表中的元素  del L[0]

    3) 删除字典中的键    del d['name']

    4) 删除对象的属性    del dog1.color

 

初始化方法:

  作用:

    对新创建的对象添加属性等初始化操作

  语法格式:

    class 类名(继承列表):

        def __init__(self[, 形参列表])

            语句块

    : [] 里的内容代表可省略

 

  说明:

    1. 初始化方法名必须为__init__ 不可改变

    2. 初始化方法会在构造函数创建实例后自动调用,且将实例自身通过第一个参数self 传入 __init__ 方法

    3. 构造函数的实参将通过 __init__方法的参数列表 传入到 __init__ 方法中

    4. 初始化方法内如果需要return 语句返回,则只能返回None

  示例:

    

class Car:

    def __init__(self, clr, brand, model):

        self.color = clr  # 颜色

        self.brand = brand  # 品牌

        self.model = model  # 型号

        # print('Car的初始化方法被调用')

 

    def run(self, speed):

        print(self.color, '的', self.brand,

              self.model, '正在以', speed,

              '公里/小时的速度行驶')

 

 

 

 

练习:

  写一个学生类, 用来描述学生信息

   要求:

     1) 为该类添加初始化方法,实现在创建对象时自动设置 '姓名', '年龄', '成绩' 属性

     2) 添加 set_score 方法能为对象修改成绩信息, 并限制成绩在 0~100之间

     3) 添加show_info方法打印学生对象的信息

    class Student:

        def __init__(.......):

             .....

        def set_score(self, score):

            ....

        def show_info(self):

            ....

 

    s1 = Student('小魏', 17, 59)

    s1.set_score(68)

  s1.show_info()  # 小魏 今年 17 岁, 成绩是: 68

  

  

答:class Student:

    def __init__(self, name, age, score=0):

        self.name = name

        self.age = age

        self.score = score

 

    def set_score(self, score):

        if 0 <= score <= 100:

            self.score = score

        else:

            # 通知调用者,调用实参不合法

            raise ValueError("值不在相应的范围内")

 

    def show_info(self):

        print(self.name, '今年', self.age,

              '岁, 成绩是:', self.score)

 

    def get_score(self):

        return self.score

 

 

s1 = Student('小魏', 17, 59)

s1.set_score(68)

s1.show_info()  # 小魏 今年 17 岁, 成绩是: 68

 

# print('s1 绑定的对象的成绩是:', s1.score)

print('s1 绑定的对象的成绩是:', s1.get_score())

  

  

析构方法

  语法:

    class 类名(继承列表):

        def __del__(self):

            语句块

  作用:

    通常用来释放此对象占用的资源

  说明:

    1. 析构方法会在对象被销毁时自动调用

    2. python语句建议不要在对象销毁时做任何事情,因为对象销毁的时间难以确定

  示例:

     # 此示例示意析构方法的用法

class Car:

    def __init__(self, name):

        self.name = name

        print("汽车", name, '对象被创建')

 

    def __del__(self):

        print("汽车", self.name, '对象被销毁')

 

c1 = Car("BYD E6")

# del c1

# L = []

# L.append(c1)

c1 = None  # 让c1变量绑定None

while True:

    pass

 

print("程序结束")

 

  

 

预置的实例属性

 

__dict__属性

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

 

  示例:

    class Dog:

       pass

 

    dog1 = Dog()

    print(dog1.__dict__)  # {}

    dog1.color = "白色"

    print(dog1.__dict__)  # {'color': '白色'}

 

 

__class__ 属性

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

  作用:

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

 

  示例:

    class Dog:

        pass

    dog1 = Dog()

    print(dog1.__class__)

    dog2 = dog1.__class__()

    print(dog2.__class__)

 

 

用于类的函数:

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

 

  type(obj)  返回对象的类

 

  示例:

    isinstance(3.14, float)  # True

    isinstance('hello', str)  # True

    class Dog:

        pass

    dog1 = Dog()

    isinstance(dog1, Dog)  # True

 

综合练习:

  有两个人( Human ):

    1. 姓名: 张三

       年龄: 35岁

    2. 姓名: 李四

       年龄: 8岁

    行为:

      1. 教别人学东西 teach

      2. 工作赚钱 work

      3. 借钱 borrow

    用程序描述如下事情:

      张三 李四 python

      李四 张三 滑冰

      张三 上班 赚了 1000元钱

      李四 张三 借了 200元钱

      显示李四的全部信息

      显示张三的全部信息

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值