• 15、python面对对象之类和对象


    前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念、类的定义、类属性、实例属性及实例方法等。

    一、类和对象的概念


    问题:什么是类?什么是实例对象?

    类:是一类事物的抽象概念,不是真实存在的,描绘了该类事物共有的特征和行为

    • 例如:猫类、狗类、鸟类、车类等

    实例对象:某类事物的具体个体,是该类事物的具体表现,它是真实存在的

    • 例如:“张三”是具体的某个“人“,”二哈“是具体的某个”狗“

     

    二、类的定义


    关键字:class

    定义类的方法:

    方式一:class 类名:

    方式二:class 类名(object):

    注意:方式一、方式二本质上是一样的,没有任何区别,只是写法不一样,他们都继承object这个基类。这里简单解释一下,在python3以前,不继承object类会少很多可操作对象,这些都是类中的高级特性,但在python3以后所有类都默认继承这个object基类了。

     

    类名的命名规范:

    1)遵循标识符的命名规范,即由字母、数字及下划线组成且不能以数字开头,不能使用关键字。

    2)建议使用大驼峰命名法(每个单词的第一个字母大写,例如:MyClass、TestCase)

    三、类属性和实例属性


    1.类属性

    什么是类属性?就是一类事物的共同特征,比如狗类,共同特征:叫声(汪汪汪)、四只脚等。

    类属性:就是定义在类中的变量

    类属性的访问:

    • 类可以直接访问类属性
    • 该类的实例对象也可以访问类属性
    class Dog:  # 创建一个狗类
        cry = '汪汪汪'  # 类属性
        leg = '四只脚'  # 类属性
    
    
    wangcai = Dog()  # 创建一个实例对象,旺财是一只具体的狗
    print('通过类名直接访问类属性:'.format(Dog.cry))  # 通过类名直接访问类属性
    print('通过实例对象访问类属性:'.format(wangcai.cry))  # 通过实例对象访问类属性

    运行结果:

    C:softwarepythonpython.exe D:/learn/python18_http_request/exercise/test.py
    通过类名直接访问类属性:
    通过实例对象访问类属性:
    
    Process finished with exit code 0

    2.实例属性

    什么是实例属性?就是实例对象特有的属性,比如旺财是一个实例对象,他的名字叫旺财,这个名字就是一个实例属性

    实例属性:实例对象特有的属性,添加实例属性的方式:

    • 实例对象.属性 = 属性值
    • 定义在类里的__init__方法里的变量

    实例属性的访问:实例属性只有该实例对象自己能访问

    class Dog:  # 创建一个狗类
        cry = '汪汪汪'  # 类属性
        leg = '四只脚'  # 类属性
    
        def __init__(self, name, age):
            """实例对象初始化方法"""
            self.name = name
            self.age = age
    
    
    # 创建一个实例对象,因为有初始化方法__init__,定义了两个必需参数,因此实例化对象时需要传两个参数
    wangcai = Dog(name='旺财', age='4')   # wangcai = Dog('旺财', '4')  这种写法也可以,顺序对应参数即可
    dog_name = wangcai.name
    dog_age = wangcai.age
    print('狗的名字:{}'.format(dog_name))  # 实例属性只能该实例对象访问
    print('狗的年龄:{}'.format(dog_age))
    
    # 通过 实例对象.属性 = 属性值 再添加一个实例属性
    wangcai.skill = '爬树'
    print(wangcai.skill)
    
    # print(Dog.name)     # 实例属性是不能通过类去访问的,会报错
    
    jojo = Dog('jojo', 3)   # 实例化对象,一只叫jojo的狗
    dog_name2 = jojo.name   # jojo只能访问自己的属性,不能访问其他实例对象(旺财)的属性
    print('狗的名字:{}'.format(dog_name2))

    运行结果:

    C:softwarepythonpython.exe D:/learn/python18_http_request/exercise/test.py
    狗的名字:旺财
    狗的年龄:4
    爬树
    狗的名字:jojo
    
    Process finished with exit code 0

    在上面例子中使用了一个__init__方法,这些是什么方法呢?被双下划线包起来的方法,是python中有特殊语义的方法,也叫魔术方法,注意自定义方法时不要用这个格式命名。魔术方法不需要手动调用,在指定的条件下会自动触发,而这个__init__方法是在创建实例对象时就会自动触发。

    3.关于self的理解

    细心的你是不是发现了?在上面的例子,类里的init方法还有一个参数self,self是什么?有什么作用?

    self可以理解为自己,即实例对象本身,哪个实例对象去调用,这个self就指向哪个实例对象,python解释器会把这个实例对象作为第一个参数传给self。这样是不是就能解释为什么实例属性只能该实例对象去访问呢。如果觉得有点绕,多理解几遍,多敲几遍吧!

    四、实例方法


    1.实例方法的定义

    • 实例方法直接定义在类中
    • 实例方法的第一个参数为self(这个参数必须要写)

    2.实例方法的访问

    • 通过实例对象直接调用,该类的实例对象都可以访问,访问实例方法时会自动将实例对象本身作为第一个参数传给self接收
    • 通过类调用实例方法时,要传递一个self参数,即传递一个实例对象(很少用这种方法)
    class Dog:  # 创建一个狗类
        cry = '汪汪汪'  # 类属性
        leg = '四只脚'  # 类属性
    
        def __init__(self, name, age):
            """实例对象初始化方法"""
            self.name = name
            self.age = age
    
        def skill(self):
            sk1 = '爬树'  # 这里定义的只是一个方法里的变量,其他方法是无法调用的
            print('技能1:{}'.format(sk1))
    
        def skill2(self, sk2):
            self.sk2 = sk2  # 接收参数sk2,这里为什么要用self.去接收?因为这样相当于定义了一个实例属性,self就是指向实例对象
            print('技能2:{}'.format(self.sk2))
    
        def skill3(self):
            print('技能3:{}'.format(self.sk2))    # 这里访问self.sk2就能访问
            print('技能4:{}'.format(sk1))     # 这里访问sk1会报错,找不到
    
    
    wangcai = Dog(name='旺财', age='4')  # wangcai = Dog('旺财', '4')  这种写法也可以,顺序对应参数即可
    dog_name = wangcai.name
    dog_age = wangcai.age
    print('狗的名字:{}'.format(dog_name))  # 实例属性只能该实例对象访问
    print('狗的年龄:{}'.format(dog_age))
    
    wangcai.skill()  # 通过实例对象直接调用实例方法
    wangcai.skill2('抓老鼠')  # 调用实例方法,该实例方法定义了一个必须参数
    wangcai.skill3()

    运行结果:

    C:softwarepythonpython.exe D:/learn/python18_http_request/exercise/test.py
    Traceback (most recent call last):
    狗的名字:旺财
      File "D:/learn/python18_http_request/exercise/test.py", line 31, in <module>
    狗的年龄:4
    技能1:爬树
    技能2:抓老鼠
    技能3:抓老鼠
        wangcai.skill3()
      File "D:/learn/python18_http_request/exercise/test.py", line 20, in skill3
        print('技能4:{}'.format(sk1))     # 这里访问sk1会报错,找不到
    NameError: name 'sk1' is not defined
    
    Process finished with exit code 1

    下面演示一个通过类访问实例方法(了解即可):

    class Dog:  # 创建一个狗类
        cry = '汪汪汪'  # 类属性
        leg = '四只脚'  # 类属性
    
        def __init__(self, name, age):
            """实例对象初始化方法"""
            self.name = name
            self.age = age
    
        def skill(self):
            sk1 = '爬树'  # 这里定义的只是一个方法里的变量,其他方法是无法调用的
            print('技能1:{}'.format(sk1))
    
        def skill2(self, sk2):
            self.sk2 = sk2  # 接收参数sk2,这里为什么要用self.去接收?因为这样相当于定义了一个实例属性
            print('技能2:{}'.format(self.sk2))
    
    
    wangcai = Dog(name='旺财', age='4')  # wangcai = Dog('旺财', '4')  这种写法也可以,顺序对应参数即可
    dog_name = wangcai.name
    dog_age = wangcai.age
    print('狗的名字:{}'.format(dog_name))  # 实例属性只能该实例对象访问
    print('狗的年龄:{}'.format(dog_age))
    
    # 通过类调用实例方法:要传递一个self参数,即传递一个实例对象
    Dog.skill(wangcai)  # 传递一个实例对象
    Dog.skill2(wangcai, '抓老鼠')  # 传递完实例对象再传方法里的必需参数

    运行结果:

    C:softwarepythonpython.exe D:/learn/python18_http_request/exercise/test.py
    狗的名字:旺财
    狗的年龄:4
    技能1:爬树
    技能2:抓老鼠
    
    Process finished with exit code 0
  • 相关阅读:
    浅谈MVVM
    组装数据和页面渲染
    Vuejs实现轮播图
    Vuejs选项卡案例
    选项卡案例
    js中用来操作数组的相关的方法
    js中用来操作字符串的相关的方法
    用逗号拼接字符串,并且去掉最后一个逗号
    微信分享链接或网站文章到微信朋友圈,缩略图片不显示,该如何解决?
    Spring 的介绍和目标
  • 原文地址:https://www.cnblogs.com/miki-peng/p/12238995.html
Copyright © 2020-2023  润新知