zoukankan      html  css  js  c++  java
  • 定制对象独有特征

    定制对象独有特征

    一、引入

    class OldboyStudent:
        school = 'oldboy'
    
        def choose_course(self):
            print('is choosing course')
    
    
    stu1 = OldboyStudent()
    stu2 = OldboyStudent()
    stu3 = OldboyStudent()
    

    对于上述的学生类,如果类的属性改了,则其他对象的属性也会随之改变

    OldboyStudent.school = 'OLDBOY'
    
    print(stu1.school)
    
    OLDBOY
    
    print(stu2.school)
    
    OLDBOY
    

    二、定制对象独有特征

    print(stu1.__dict__)
    
    {}
    
    print(stu2.__dict__)
    
    {}
    

    对象本质类似于类,也是一个名称空间,但是对象的名称空间存放对象独有的名字,而类中存放的是对象们共有的名字。因此我们可以直接为对象单独定制名字。

    stu1.name = 'tank'
    stu1.age = 18
    stu1.gender = 'male'
    
    print(stu1.name, stu1.age, stu1.gender)
    
    tank 18 male
    
    try:
        print(stu2.name, stu2.age, stu2.gender)
    except Exception as e:
        print(e)
    
    'OldboyStudent' object has no attribute 'name'
    
    stu2.name = 'sean'
    stu2.age = 19
    stu2.gender = 'female'
    
    print(stu2.name, stu2.age, stu2.gender)
    
    sean 19 female
    

    三、属性查找

    首先从自身查找,没找到往类中找,类中没有则会报错。即对象的属性查找顺序为:自身--》类--》报错

    四、类定义阶段定制属性

    def init(obj, x, y, z):
        obj.name = x
        obj.age = y
        obj.gender = z
    
    
    init(stu1, 'tank1', 181, 'male1')
    print(stu1.name, stu1.age, stu1.gender)
    
    tank1 181 male1
    
    init(stu2, 'sean1', 191, 'female1')
    print(stu2.name, stu2.age, stu2.gender)
    
    sean1 191 female1
    

    使用上述方法虽然让我们定制属性更简单,但是还是太麻烦了,如果可以在实例化对象的时候自动触发定时属性,那就更方便了,因此可以使用类的__init__方法。

    class OldboyStudent:
        school = 'oldboy'
    
        def __init__(self, name, age, gender):
            """调用类的时候自动触发"""
            self.name = name
            self.age = age
            self.gender = gender
            print('*' * 50)
    
        def choose_course(self):
            print('is choosing course')
    
    
    try:
        stu1 = OldboyStudent()
    except Exception as e:
        print(e)
    
    __init__() missing 3 required positional arguments: 'name', 'age', and 'gender'
    
    stu1 = OldboyStudent('nick', 18, 'male')
    
    **************************************************
    

    通过上述现象可以发现,调用类时发生两件事:

    创造一个空对象
    自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入

    print(stu1.__dict__)
    
    {'name': 'nick', 'age': 18, 'gender': 'male'}
    
  • 相关阅读:
    HDU
    HDU-1166 敌兵布阵 (基础线段树)
    Matrices with XOR property (暴力)
    CF-825E Minimal Labels (反向拓扑)
    CodeForces-1144E Median String (模拟)
    操作文件和目录
    文件读写
    装饰器
    数据结构和算法
    Scrapy shell调试返回403错误
  • 原文地址:https://www.cnblogs.com/Dr-wei/p/11861887.html
Copyright © 2011-2022 走看看