• python:类与对象命名空间、面对对象的组合用法


    1,类里可以定义两种属性:

      #静态属性   #静态属性就是直接在类中定义的变量

      #动态属性  #动态属性就是定义在类中的方法

    class Course:    
       language
    = ['Chinese']#静态属性 def __init__(self,teacher,course_name,period,price):#动态属性 self.teacher = teacher self.name = course_name self.period = period self.price = price def func(self): pass
    • 其中类的数据属性是共享给所有对象的

    • >>>id(egg.role)
      4341594072
      >>>id(Person.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,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

    del python.language
    print(python.language)
    print(python.__dict__)
    print(Course.language)
    print(linux.language)
    print(linux.__dict__)
    • 总结
    • # 类中的静态变量 可以被对象和类调用
      # 对于不可变数据类型来说,类变量最好用类名操作
      # 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的

     2面对对象的组合用法

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

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

    问题:

      圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
    这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

    from math import pi
    
    class Circle:
        '''
        定义了一个圆形类;
        提供计算面积(area)和周长(perimeter)的方法
        '''
        def __init__(self,radius):
            self.radius = radius
    
        def area(self):
             return pi * self.radius * self.radius
    
        def perimeter(self):
            return 2 * pi *self.radius
    
    
    circle =  Circle(10) #实例化一个圆
    area1 = circle.area() #计算圆面积
    per1 = circle.perimeter() #计算圆周长
    print(area1,per1) #打印圆面积和周长
    
    class Ring:
        '''
        定义了一个圆环类
        提供圆环的面积和周长的方法
        '''
        def __init__(self,radius_outside,radius_inside):
            self.outsid_circle = Circle(radius_outside)
            self.inside_circle = Circle(radius_inside)
    
        def area(self):
            return self.outsid_circle.area() - self.inside_circle.area()
    
        def perimeter(self):
            return  self.outsid_circle.perimeter() + self.inside_circle.perimeter()
    
    
    ring = Ring(10,5) #实例化一个环形
    print(ring.perimeter()) #计算环形的周长
    print(ring.area()) #计算环形的面积

    用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教师与生日

    class Birthday:
        def __init__(self,year,month,day):
            self.year = year
            self.month = month
            self.day = day
    
    class Course:
        def __init__(self,course_name,period,price):
            self.name = course_name
            self.period = period
            self.price = price
    
    class Teacher:
        def __init__(self,name,age,sex,birthday):
            self.name = name
            self.age = age
            self.sex = sex
            self.birthday =birthday
            self.course = Course('python','6 month',2000)
    
    b = Birthday(2018,1,16)
    egg = Teacher('egon',0,'',b)
    print(egg.name)
    print(egg.birthday.year)
    print(egg.birthday.month)
    print(egg.course.price)

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

  • 相关阅读:
    植物大战僵尸课设个人报告
    MXNET框架基础2CVhotdog
    MXNET框架基础3GPU计算
    MXNET框架基础7BN
    MXNET框架基础0预备知识
    开课吧名企计算机视觉第一课
    MXNET框架基础5符号式编程
    MXNET框架基础1模型构建基本原理
    faceid算法原理简述
    MXNET框架基础6图像增广
  • 原文地址:https://www.cnblogs.com/kakawith/p/8296777.html
Copyright © 2020-2023  润新知