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()

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

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()

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

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__}")

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()
  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值