zoukankan      html  css  js  c++  java
  • Python 类的名称空间和组合

    一、Python类的名称空间

    class Student(object):
        School = '北京大学'
        def __init__(self):
            pass
    
    stu1 = Student()
    stu1.name = '小明'
    print(stu1.School)
    print(Student.name) #error  type object 'Student' has no attribute 'name'
    

    1.类可以调用对象的属性吗?

    2.对象可以调用类属性吗?

    通过上面的代码可以看出,类无法访问对象的属性,由于对象和类之间存在一个关联关系,所以对象能够找到类。

    使用类名.属性名,只能寻找类中的静态属性名

    使用对象.属性名,现在对象自己的名称空间内找,如果找不到,再到类的内存空间找。

    对象修改类的静态属性

    我们想象一个场景:妈妈和爸爸工作挣钱,然后把钱放在钱箱里,供一个家庭使用:

    class Person(object):
        Home_Money = 0
        def __init__(self):
            pass
    
    mother = Person()
    mother.Home_Money += 1000
    father = Person()
    father.Home_Money += 1000
    
    print(mother.Home_Money) #1000
    print(father.Home_Money) #1000
    print(Person.Home_Money) #0

    通过上面代码,Person中的Home_Money还是0,这是因为  对象.属性名 = 1000 是赋值操作,只是给对象添加了一个属性,并没有修改Person中静态属性。

    如果我们把 Home_Money设置成list,结果将会不同

    class Person(object):
        Home_Money = [0]
        def __init__(self):
            pass
    
    mother = Person()
    mother.Home_Money[0] +=  1000
    father = Person()
    father.Home_Money[0] +=  1000
    
    print(mother.Home_Money) #2000 
    print(father.Home_Money) #2000
    print(Person.Home_Money) #2000

    只要使用静态属性,就必须使用类名去调用,尽量不要使用对象名。

    #统计一个类被实例化次数
    class Person():
        count = 0
        def __init__(self):
            Person.count += 1
    
    alex = Person()
    egon = Person()
    xiaoming = Person()
    laowang = Person()
    
    print('实例化次数:%s' %Person.count)

    二、对象组合

     求圆环的面积

    from math import pi
    class Ring():
        def __init__(self,R,r):
            self.R = R
            self.r = r
        def area(self):
            return pi*(self.R**2) - pi*(self.r**2)
    
        def perimeter(self):
            return 2*pi*self.R +  2*pi*self.r
    ring = Ring(10,5)
    print(ring.area())  #235.61944901923448
    print(ring.perimeter()) #94.24777960769379

    使用对象组合重写写一遍求圆环的面积和周长

    class Ring():
        def __init__(self,out,inner):
            self.out = Circle(out) # 一个类的对象属性 = 另一个类的对象
            self.inner = Circle(inner)
        def area(self):
            return self.out.area() - self.inner.area()
    
        def perimeter(self):
            return self.out.perimeter() + self.inner.perimeter()
    ring = Ring(10,5)
    print(ring.area())
    print(ring.perimeter())

    什么时候使用面向对象组合: 类与类之间有一种"什么有什么的关系" --> 圆环里有,学生类中与生日类,人物拥有xx装备等 

  • 相关阅读:
    使用Pencil进行UI草图设计
    模板机制在Zend Framework
    数组/链表高效去重(算法题
    Docker常用命令总结
    vscode中的git使用
    二分搜索模板
    多年没有管理的技术博客了,即日起开始管理起技术博客
    c# office不同版本下中使用Excel
    最近在忙项目,好久不来
    中秋 国庆
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8515427.html
Copyright © 2011-2022 走看看