• Python 编程基础 | 第五章-类与对象 | 5.2、数据成员


    一、属性成员

    属性成员是指类中定义的变量,即属性,根据定义位置,又可以分为类属性实例属性,下面分别进行介绍。

    1、实例属性

    实例属性是指定义在类的方法中的属性,该属性属于当前实例,例如:定义一个Dog类,在该类的__init__()方法中定义2个实例属性,代码如下:

    class Dog:
        "实现一个小狗类"
        def __init__(self, name, age) -> None:
            self.name = name
            self.age = age
        
        def sit(self):
            "小狗接收到蹲下指令"
            print(f"{self.name} is now sitting")
    
    my_dog = Dog("jack", 10)
    my_dog.sit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以使用.来访问对象的属性,但是,实例属性只能通过实例名访问,不能通过类名访问,如果使用类名访问会报错

    2、类属性

    类属性是指在定义类中,并且在函数体外的属性,类属性可以在类的所有实例之间共享,例如:定义一个雁类,在该类中定义3个类属性,代码如下:

    class Geese:
        """大雁类"""
        beak_1 = "喙,比较尖"   # 定义类属性(喙)
        wing_1 = "翅膀,比较大" 
        claw_1 = "爪,行走自如"
    
        def __init__(self):
            print("我是大雁类!我有一下特征:")
            print(Geese.beak_1)   # 访问类属性
            print(Geese.wing_1)
            print(Geese.claw_1)
    
    my_geese = Geese()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    通过类名.的方式访问类属性

    3、内置类属性

    Python有一些内置的类属性,记录类相关的信息,如下:

    属性功能
    __dict__类的属性(包含一个字典,由类的数据属性组成)
    __doc__类的文档字符串
    __name__类名
    __module__类定义所在的模块
    __bases__类的所有父类构成的元素

    示例:

    class Dog:
        "实现一个小狗类"
        def __init__(self, name, age) -> None:
            self.name = name
            self.age = age
        
        def sit(self):
            "小狗接收到蹲下指令"
            print(f"{self.name} is now sitting")
    
    print (f"Dog.__doc__:{Dog.__doc__}")
    print (f"Dog.__name__:{Dog.__name__}")
    print (f"Dog.__module__:{Dog.__module__}")
    print (f"Dog.__dict__:{Dog.__dict__}")
    print (f"Dog.__bases__:{Dog.__bases__}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4、动态调整属性 – 反射

    在代码运行之前,类/实例的属性名和值都是不知道的。要在代码的运行过程当中,才知道要给类/对象、添加/删除/修改额外的属性。类的属性和方法,此处统一称为atrribute(属性),动态处理属性的方法有下面这些,如下:

    • hasattr(对象/类, 属性名):对象/类 是否有这个属性,有就是True, 没有就是False
    • getattr(对象/类, 属性名):获取 对象/类 的属性值
    • setattr(对象/类, 属性名, 属性值):添加 对象/类 的属性和值, 如果属性存在,修改 对象/类 的属性值
    • delattr(对象/类, 属性名):删除 对象/类 的属性和值

    示例:

    class Person:
        def __init__(self, name):
            self.name = name
            self._private_money = 2000
            self.__secrect = "秘密"
    
        def eat(self, food):
            print(f"喜欢吃什么?{food}")
    
        def sleep(self):
            print("睡觉中.....")
    
    # 类属性
    if hasattr(Person, "hello"):
        print(Person.hello)
    else:
        setattr(Person, "hello", "hello,class")
    print(Person.hello)
    
    # 实例属性
    f = Person("base")
    ss = Person("sss")
    if hasattr(f,"sex"):
        print(f.sex)
    else:
        setattr(f, "sex", "女")
    
    print(f.sex)    # 输出结果:女
    # print(ss.sex) # 编译报错:'Person' object has no attribute 'sex'
    
    # 删除f对象的name属性之后,再次访问f的name属性
    delattr(f, "name")
    # print(f.name) # 编译报错:'Person' object has no attribute 'name'
    print(ss.name)
    
    # 判断对象有没有某个方法
    f = Person("base")
    print(f.__dict__)
    
    if hasattr(f, "sleep"):
        f.sleep()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    【雅思阅读】王希伟阅读P4(matching2段落信息配对题【困难】)
    vue+elementUI el-select 自定义搜索逻辑(filter-method)
    测试数据工厂-信贷场景下的实践
    什么是重绘和回流(重排)?什么情况下会用到?如何减少
    前端面试题二(持续更新)
    Linux 本地 Docker Registry本地镜像仓库远程连接
    基于SSM的星空游戏购买下载平台
    [Vue] 自定义命令
    【计算机视觉】BYOL 讲解
    Springboot 实践(17)spring boot整合Nacos配置中心
  • 原文地址:https://blog.csdn.net/cloud323/article/details/133691527