Day14总结2

类: 拥有相同属性和相同功能的对象的集合

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__)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容