类的继承于查找顺序:

在py2中,不继承object的类为经典类,经典类继承查找:深度优先.

在py3中,默认继承object,所以python3中都是新式类,新式类的继承查找:广度优先.

类的特殊属性:

类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
class People:
"""
我是文档
"""
country='China'
x=1
def run(self):
"""
我也是文档
:return:
"""
print('----->', self) # 实例化出三个空对象
obj1=People()
obj2=People()
obj3=People() # 为对象定制自己独有的特征
obj1.name='egon'
obj1.age=18
obj1.sex='male' obj2.name='lxx'
obj2.age=38
obj2.sex='female' obj3.name='alex'
obj3.age=38
obj3.sex='female' print(People.__doc__) # 类中的说明文档
# 我是文档 print(obj1.run.__doc__) # 类中方法的说明文档 #我也是文档
# :return:
print(People.__name__) # 类的名字,返回是一个字符串
#People
print(People.__bases__) # 类继承的父类
# (<class 'object'>,)
print(People.__dict__) # 类的字典属性
#{'__module__': '__main__', '__doc__': '\n 我是文档\n ', 'country': 'China', 'x': 1, 'run': <function People.run at 0x0000000002A2D840>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>}
print(People.__module__) # 类定义所在的模块
# __main__
print(People.__class__) # 实例对应的类(仅新式类,默认type类)
# <class 'type'>

组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,

1.继承的方式

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人

2.组合的方式

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

3.什么时候使用?

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

# 组合

class People:
def __init__(self,name,sex,age):
self.name = name
self.sex=sex
self.age =age class Course:
def __init__(self,name,price,period):
self.name =name
self.price = price
self.period =period class Stu(People):
def __init__(self,name,sex,age):
People.__init__(self,name,sex,age)
self.course =[] class Teacher(People):
def __init__(self,name,sex,age):
People.__init__(self,name,sex,age)
self.stu=[] # 创建课程对象
py = Course("python",19800,"8months")
linux = Course("linux",12000,"9months")
#创建学生对象
s1 = Stu("jack","男",22)
s2 = Stu("lucy","女",18)
# 给学校添加课程,这里运用了组合.
s1.course.append(py)
s1.course.append(linux)
s2.course.append(py)
s2.course.append(linux)
#创建讲师对象
t1 = Teacher("Nick","男",25)
# 给讲师添加学生,这里运用了组合.
t1.stu.append(s1)
t1.stu.append(s2) # 查看学生s1的课程信息
for course_obj in s1.course:
print("课程名:%s,价格:%s,周期:%s"%(course_obj.name,course_obj.price,course_obj.period)) """
课程名:python,价格:19800,周期:8months
课程名:linux,价格:12000,周期:9months """
# 查看讲师的学生
for stu in t1.stu:
print(stu.name) """
jack
lucy """

Day 5-<补充> 类的的继承和查找顺序的更多相关文章

  1. 类和实例属性的查找顺序 mro查找

    如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用 mro方法 例如: class A: pass class C(D): pass class B(D): pass class A(B, ...

  2. 【python】-- 类的多继承、经典类、新式类

    继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...

  3. python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序

    exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...

  4. Action类为何要继承ActionSupport

    Action类为何要继承ActionSupport   理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...

  5. 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?

    接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 1. 接口可以继承接口. 2. 抽像类可以实现(implements)接 ...

  6. C++学习19 类的多继承

    在前面的例子中,派生类都只有一个基类,称为单继承.除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类. 多继承容易让代码逻辑复杂.思路混乱,一直备受争议,中小型项目中较少使用,后来的 Ja ...

  7. 24 类:组合 继承 super关键字 面向对象的三大性

    组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def __init__(self, name, age): self.name = name self.age = ag ...

  8. Java开发笔记(四十八)类的简单继承

    前面介绍了类的基本用法,主要是如何封装一个类的各项要素,包括成员属性.成员方法.构造方法等,想必大家对类的简单运用早已驾轻就熟.所谓“物以类聚,人以群分”,之所以某些事物会聚在一起,乃是因为它们拥有类 ...

  9. Es5中的类和静态方法 继承

    Es5中的类和静态方法 继承(原型链继承.对象冒充继承.原型链+对象冒充组合继承) // es5里面的类 //1.最简单的类 // function Person(){ // this.name='张 ...

随机推荐

  1. PHP程序员的能力水平层次

    PHP程序员的能力水平层次 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点. 下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开 ...

  2. java.util.concurrent包学习笔记(一)Executor框架

    类图: 其实从类图我们能发现concurrent包(除去java.util.concurrent.atomic 和 java.util.concurrent.locks)中的内容并没有特别多,大概分为 ...

  3. Java学习笔记(四)——好记性不如烂键盘(答答租车)

    根据所学知识,编写一个控制台版的租车系统. 功能: 1. 展示所有可租车辆 2. 选择车型.租车辆 3. 展示租车清单,包含:总金额.总载货量及其车型.总载人量及其车型 代码参考imooc中Java课 ...

  4. vue.js 二维码生成组件

    安装 通过NPM安装 npm install vue-qart --save 插件应用 将vue-qart引入你的应用 import VueQArt from 'vue-qart' new Vue({ ...

  5. 第23章 Spring MVC初体验

    23.1 鸟瞰Spring MVC 粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加 ...

  6. 使用Nginx实现反向代理

    一.代理服务器 1.什么是代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务 ...

  7. Memcache分布式锁 转发 https://www.cnblogs.com/li150dan/p/9529090.html

    在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限 下面通过一个简单例子介绍: 这里引用的是Memcached.ClientLibrary.d ...

  8. GoldenGate OGG-01032 There Is a Problem in Network Communication Error in Writing to Rmt Remote Trail Rmttrail (Doc ID 1446621.1)

    GoldenGate OGG-01032 There Is a Problem in Network Communication Error in Writing to Rmt Remote Trai ...

  9. Linux Docker命令

    命令查看你当前的内核版本:uname -r yum 包更新到最新:yum update 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemap ...

  10. 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    Spring Security功能多,组件抽象程度高,配置方式多样,导致了Spring Security强大且复杂的特性.Spring Security的学习成本几乎是Spring家族中最高的,Spr ...