一、属性成员
属性成员是指类中定义的变量,即属性,根据定义位置,又可以分为类属性和实例属性,下面分别进行介绍。
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()
来源地址:https://blog.csdn.net/cloud323/article/details/133691527