zoukankan      html  css  js  c++  java
  • 类与对象的命名空间

                                                                        类命名空间与对象、实例的命名空间

    上回书说到类和对象,那么额在创建类或者对象的时候也会相应的产生各自的命名空间,而各自的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

    而类有两种属性:静态属性和动态属性

    • 静态属性就是直接在类中定义的变量
    • 动态属性就是定义在类中的方法

    其中类的数据属性是共享给所有对象的

    >>>id(egg.role)
    4341594072
    >>>id(Person.role)      #role是一个变量,在这里就是数据属性
    4341594072

    而类的动态属性是绑定到所有对象的

    >>>egg.attack
    <bound method Person.attack of <__main__.Person object at 0x101285860>>
    >>>Person.attack
    <function Person.attack at 0x10127abf8> 

    在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

                                                                                                                                                              面向对象组合用法

    软件重用的重要方式除了继承之外还有另外一种方式,即:组合

    组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

    复制代码

    class Weapon:
        def prick(self, obj):  # 这是该装备的主动技能,扎死对方
            obj.life_value -= 500  # 假设攻击力是500
    
    class Person:  # 定义一个人类
        role = 'person'  # 人的角色属性都是人
    
        def __init__(self, name):
            self.name = name  # 每一个角色都有自己的昵称;
            self.weapon = Weapon()  # 给角色绑定一个武器;
            
    egg = Person('egon')
    egg.weapon.prick() 
    #egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法
    上面人与武器的组合就是典型的组合使用方法
    用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如我有手,手属于我,但是我不是手的集合。
    class BirthDate:
    def __init__(self,year,month,day): self.year=year self.month=month self.day=day class Couse: def __init__(self,name,price,period): self.name=name self.price=price self.period=period class Teacher: def __init__(self,name,gender,birth,course):
            self.name=name 
    self.gender=gender
    self.birth=birth
    self.course=course
        def teach(self): 
    print('teaching')
    p1=Teacher('egon','male', 
    BirthDate('1995','1','27'),
    Couse('python','28000','4 months')
    )

    print(p1.birth.year,p1.birth.month,p1.birth.day)

    print(p1.course.name,p1.course.price,p1.course.period)
    '''
    运行结果:
    1 27
    python 28000 4 months
    '''

    当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
    
    

         

  • 相关阅读:
    省市区distpicker,从数据库里查出来回显,动态绑定
    ajax请求里面的success和error里面的layer.msg,status: "parsererror",刷新父界面,碰到的一些问题
    排序算法时间和空间算法度
    适配器模式
    守护线程
    工厂模式之简单工厂模式、工厂模式、抽象工厂
    ArrayList源码分析和缩减版手写ArrayList(jdk1.8和1.9)
    HashMap排序题
    二进制中1的个数
    anaconda指定镜像源,解决conda下载速度慢失败问题
  • 原文地址:https://www.cnblogs.com/ddjl/p/8310453.html
Copyright © 2011-2022 走看看