一、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) #
print(father.Home_Money) #
print(Person.Home_Money) #

通过上面代码,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) #
print(Person.Home_Money) #

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

#统计一个类被实例化次数
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装备等

Python 类的名称空间和组合的更多相关文章

  1. day 19 类的名称空间,组合,派生

    对象的属性: 不仅在__init__里面添加,还可以在其他方法或者类外面添加 class Game: def __init__(self,name,age): self.name = name sel ...

  2. python基础:名称空间与作用域

    Python的变量定义后都有自己的作用域,每个作用域内都有名字空间.名称空间就是变量名称与对象的关联关系.Python中使用变量名引用对象,需要使用该变量时,就在命名空间中进行搜索,获取对应的对象.从 ...

  3. python之函数名称空间,作用域,嵌套函数

    目录 嵌套函数 定义 名称空间的三大类(只存变量名) 名称空间加载顺序 变量名的查找顺序为 作用域 嵌套函数 定义 函数内部定义的函数,无法在函数外部使用内部定义的函数. def f1(): def ...

  4. using 关键字给类和名称空间指定别名

    1. using System; using System.Text; namespace DLL { public class Class1 { public void showStr() { Co ...

  5. python 函数的名称空间及作用域

    一:名称空间 1:什么是名称空间: 名称空间即:储存名字与值的内存地址关联关系的空间 2.名称空间的分类: 内置名称空间:存储器自带的一些名称与值的对应关系,如:print,len,max等; 生命周 ...

  6. python入门之名称空间

    name = 'tank' 什么是名称空间? 存放名字的空间 如果你想访问一个变量值,必须先访问对应的名称空间,拿到名字和对应的内存地址的绑定关系 名称空间的分类: 1.内置名称空间: python提 ...

  7. Python—函数的名称空间

    名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方 名称空间共3种, ...

  8. python入门之名称空间的查找顺序

    名称空间的查找顺序: 局部:局部 > 全局 > 内置 全局:全局 > 内置 # 内置再找不到就报错 # 函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关 x = 111 ...

  9. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

随机推荐

  1. (转)Spring用代码来读取properties文件

    转至http://www.cnblogs.com/Gyoung/p/5507063.html 我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org ...

  2. logstash收集MySQL慢查询日志

    #此处以收集mysql慢查询日志为准,根据文件名不同添加不同的字段值input { file { path => "/data/order-slave-slow.log" t ...

  3. BZOJ1089 [SCOI2003]严格n元树 【dp + 高精】

    Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...

  4. 洛谷 P2498 [SDOI2012]拯救小云公主 解题报告

    P2498 [SDOI2012]拯救小云公主 题目描述 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一 ...

  5. LOJ分块⑨题汇总

    从零开始的分块学习系列(感谢hzwer) 题目顺序是我建议的做题顺序 先说一句:分块的核心思想(其实本身分块就可以说是一种思想)是:均摊(或者说平衡/权衡?)复杂度,同时这种思想本身不只局限于序列分块 ...

  6. [CEOI2004]锯木厂选址

    link 试题分析 做这种题就应该去先写个暴力代码 #include<iostream> #include<cstring> #include<cstdio> #i ...

  7. [树莓派]wifi在面板看不到,但是可以scan到的解决方案

    突然遇到一个问题,发现在wifi面板中找不到WiFi,但是运行scan命令可以发现WiFi,多方查找资料终于找到了一个解决方案: 运行如下命令: sudo apt-get install wicd   ...

  8. 用for语句从数组中剔除数据,注意,count,要放到for语句之外才行

    date_default_timezone_set('Asia/Shanghai'); $arr = array( ,), ,), ,), ,) ); print_r($arr); ;$i<co ...

  9. URL参数带加号“+”AJAX传值失败的解决方法

    URL中参数的值有加号,虽然请求的URL中含有加号,但是GET的时候却得不到加号! 解决办法,用JavaScript的encodeURIComponent函数对加号进行编码. 如str="a ...

  10. Hibernate学习(5)- session的get与load方法对比

    1.共同点:get和load都是根据Id单条查询获取对象 org.hibernate.Session.load(Class<User> theClass, Serializable id) ...