类: 拥有相同属性和相同功能的对象的集合
1.属性
属性分为: 类的字段、对象属性
1)类的字段
a.声明: 直接声明在类中的变量就是类的字段
b.怎么使用: 通过'类.'的方式去使用
c.什么时候用: 属性的值不会因为对象不同而不同,就使用类的字段
2)对象属性
a.声明:对象属性需要声明在init方法中, 以'self.属性=值'的方式来声明
b.怎么使用:通过'对象.'的方式去使用
c.什么时候用:属性的值会因为对象不同而不同,就使用对象属性
class Person:
"""类的说明文档: 人类"""
# 1.属性
num = 61 #类的字段
def __init__(self, name1, age1=0):
# 这儿的name和age就是Person类的对象属性
self.name = name1
self.age = age1
# 2.方法
# 使用字段的方法;类.
Person.num = 60
print(Person.num)
# 使用对象属性
p1 = Person('小明') #声明一个对象
print(p1.name, p1.age)
p2 = Person('小花', 3) #声明一个对象
print(p2.name, p2.age) #打印对象属性
练习: 声明一个Dog类,有属性: 名字、年龄、颜色、品种。
要求创建Dog对象的时候名字和颜色必须赋值,年龄可以赋值也可以不赋值,品种不能赋值!
有一个吃的方法,要求不同的Dog对象,调用这个方法的时候打印'XXX(名字)在吃XXX(吃的东西)'
class Dog:
"""狗类"""
# 属性
def __init__(self, name1, color1, age1=0):
self.name = name1
self.age = age1
self.color = color1
self.type = '无'
# 方法
def eat(self, food: str):
print('%s在吃%s' % (self.name, food))
dog1 = Dog('花花', '白色', 3) #创建对象
dog1.type = '泰迪'
dog2 = Dog('财财', '黄色', 1)
dog2.type = '中华田园犬'
print(dog1.name, dog2.name)
dog1.eat('骨头')
dog2.eat('屎~') # 对象.f方法
第二节 对象属性的增删改查
class Student:
def __init__(self, name1, age1=18):
self.name = name1
self.age = age1
self.stu_id = '001'
stu1 = Student('小明', 20)
stu2 = Student('小红')
1.对象属性的增删改查
1)查 - 获取对象属性的值
a.对象.属性 - 获取对象属性的值,属性不存在会报错
b.getattr(对象,属性名) - 获取对象属性的值,属性不存在会报错
getattr(对象,属性名, 默认值) - 获取对象属性的值,属性不存在不会报错,并且返回默认值
print('==============查===============')
print(stu1.name) #查询学生的名字
print(getattr(stu1, 'name')) #查询学生的名字
p_name = 'name' #声明一个属性
print(getattr(stu1, p_name)) #查询它
# print(stu1.p_name) # AttributeError: 'Student' object has no attribute 'p_name'
print(getattr(stu1, 'name1', '无'))
2) 增/改 - 添加/修改属性
a. 对象.属性 = 值 - 当属性存在的时候修改属性的值,当属性不存在的时候添加属性
b. setattr(对象, 属性名, 值) - 当属性存在的时候修改属性的值,当属性不存在的时候添加属性
print('==============增/改==============')
stu1.name = '张三'
print(stu1.name)
setattr(stu1, 'age', 22)
print(stu1.age)
stu1.gender = '男'
print(stu1.gender)
setattr(stu1, 'score', 100)
print(stu1.score)
3)删 - 删除对象属性
a. del 对象.属性
b. delattr(对象, 属性名)
print('==============删==============')
del stu1.stu_id
# print(stu1.stu_id) # AttributeError: 'Student' object has no attribute 'stu_id'
delattr(stu1, 'age')
# print(stu1.age)
注意: 对象属性的增删改查只针对单个对象
print(stu1.gender)
# print(stu2.gender) # AttributeError: 'Student' object has no attribute 'gender'
stu1.names = 'xiaoming'
print(stu1.names)
2. slots魔法
class Person:
# 在类中可以通过给__slots__赋值来约束当前类的对象有哪些对象属性
__slots__ = ('name', 'age', 'gender', 'id')
def __init__(self, name1, age1):
self.name = name1
self.age = age1
# self.height = 180
print('================slots魔法==============')
p1 = Person('小敏', 10)
p1.gender = '男'
# p1.id = '小明'
# p1.name1 = '花花' 属性有限制,添加会报错
第三节:内置内属性
1.类.name :获取类名
2.类.doc:获取类的说明文档
3.对象.class:获取对象的类
4.类.dict:获取类的字段
5.对象.dict:获取对象的属性
6.类.bases:获取当前类的父类
class Car:
"""说明文档: 车类"""
num = 100
def __init__(self, price1=50000, color1='黑色', brand1='丰田'):
self.color = color1
self.brand = brand1
self.price = price1
self.speed = 100
def stop(self):
self.speed = 0
car1 = Car()
1.内置类属性:声明类的时候系统自动给类添加的属性
1) name
字段, 获取类的类名
print(Car)
print(Car.__name__, type(Car.__name__))
2) doc
字段, 获取类的说明文档
print(Car.__doc__)
3) class
对象属性, 获取对象的类
C1 = car1.__class__
print(C1)
car2 = C1()
print('car2:', car2)
print([1, 2].__class__)
4)dict(重点)
字段, 获取当前类所有的字段和字段对应的值以字典的形式返回(了解)
对象属性, 获取当前对象中所有的对象属性和对应的值
print(Car.__dict__)
print(car1.__dict__)
5) module
字段, 获取当前类所在(声明在哪儿)的模块的名字
print(Car.__module__)
6) bases
字段, 获取当前类的父类
print(Car.__bases__)