day 19 类的名称空间,组合,派生
对象的属性: 不仅在__init__里面添加,还可以在其他方法或者类外面添加
class Game:
def __init__(self,name,age):
self.name = name
self.age = age p1 = Game('盖伦', 18)
p1.sex = 'male' # 类外面添加对象属性
print(p1.__dict__)
类的属性: 不仅在类内部添加,还可以在类外面添加
class Game: def __init__(self,name,age):
self.name = name
self.age = age Game.tools = '青龙刀' # 类外面添加类的属性
print(Game.__dict__)
对象空间中存在一个类对象指针,所以对象可以找到类中的变量以及方法 (对象可以找类的属性)
类名只能找到类中的变量,方法,后者(父类中的),不能找对象中的属性 (类不能找对象的属性)
组合: 将一个对象封装到另一个对象的属性中
class Game:
def __init__(self,name,ad):
self.name = name
self.ad = ad def attack(self,x):
print('{}攻击{}'.format(self.name,x.name)) def equip_wappon(self,wap):
self.wap = wap # 组合:给一个对象封装一个属性该属性是另一个类的对象
# 给wuda封装一个wuda.wap属性(knife), wuda.wap = knife class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def waapon_attack(self,w,s):
print('{} 用 {} 攻击了 {}'.format(w.name,knife.name,s.name))
knife = Weapon('18厘米长棍', 99)
wuda = Game('武大',20)
seman = Game('西门',10)
# wuda.attack(seman)
# knife.waapon_attack(wuda,seman) # 武大 用 18厘米长棍 攻击了 西门
wuda.equip_wappon(knife)
wuda.wap.waapon_attack(wuda,seman) # 武大 用 18厘米长棍 攻击了 西门
组合示例
组合的好处:
代码更合理
类与类之间的耦合性增强(并不是好事)
补充: 开发原则,高汇聚,低耦合
继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Person:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Dog:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
# 以上三种类,都有相似的属性。所以Person、Dog可以继承Animal,减少代码
继承举例
继承的示例:
class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Person(Animal): # (Animal)继承Animal的属性
pass p1 = Person('西门','M',18) # 必须传参数,不然会报错
print(p1.__dict__) # {'name': '西门', 'sex': 'M', 'age': 18} Animal是父类
Person是子类,派生类
单继承
类名:
可以调用父类的属性,方法
class Animal:
type = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('要吃饭') class Person(Animal): # (Animal)继承Animal的属性
# type = '不喜欢吃饭'
pass print(Person.type) # 类名可以调用父类的属性
Person.eat('') # 类名可以调用父类的方法
Person.type = 666 # 这样只是给Person添加type属性,并不能更改父类的type属性
print(Animal.__dict__) # type = '动物类'
print(Person.type)
类名
对象:
对象执行类的父类的属性和方法
class Animal:
type = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('要吃饭') class Person(Animal): # (Animal)继承Animal的属性
type = '不喜欢吃饭'
pass p1 = Person('西门','M',18) # 必须传参数,不然会报错
print(p1.type) # 动物类 可以调用父类的属性
print(p1.type) # 不喜欢吃饭 如果自己有和父类相同的属性,则先用自己的
p1.eat() # 可以调用父类的方法
p1.type = 666 # 这样只是改p1的属性,并不能更改父类的type属性
print(p1.__dict__) # type = '动物类'
对象
继承:单继承,多继承
# python 类:
# 经典类:只存在python2x,不继承object的类,所以python2x既有经典类,又有新式类。
# 新式类:继承object类。python3x所有的类默认都继承object。
# 单继承都一样。
# 多继承不一样:
# 经典类 :深度优先。
# 新式类 : mro 继承顺序,C3算法。
# 既要执行子类方法,也要执行父类方法
class Animal:
type = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('要吃饭') class Person(Animal): # (Animal)继承Animal的属性
def __init__(self, name, sex, age, mind):
# Animal.__init__(self,name,sex,age) #方法一
super().__init__(name, sex, age) # 方法二
self.mind = mind def eat(self):
super().eat() p1 = Person('西门', 'M', 18, '有思想')
print(p1.__dict__)
p1.eat() # 要吃饭
# 方法一: Aniaml.__init__(self,name,sex,age)
# p1 = Person('春哥','laddboy',18,'有思想')
# print(p1.__dict__) # 方法二:super
# p1 = Person('春哥','laddboy',18,'有思想')
# print(p1.__dict__)
day 19 类的名称空间,组合,派生的更多相关文章
- Python 类的名称空间和组合
一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...
- python_面向对象,类名称空间,对象名称空间,组合
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量(字段) 动态属性就是定义在类中的方法 其中类 ...
- using 关键字给类和名称空间指定别名
1. using System; using System.Text; namespace DLL { public class Class1 { public void showStr() { Co ...
- python面向对象:类空间,对象空间, 组合
一. 类空间,对象空间 1. 类空间,对象空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变 ...
- python基础——类名称空间与对象(实例)名称空间
python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...
- 搞懂Python的类和对象名称空间
代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...
- python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间
一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...
- python 之 面向对象基础(定义类、创建对象,名称空间)
第七章面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 优点:复杂的问 ...
- 11-TypeScript中的名称空间
在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起.一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织. 在TypeScript中, ...
随机推荐
- Servlet基本_サーブレットのライフサイクル、スレッドセーフ
1.サーブレットのライフサイクル初期化時 ⇒ init() [初回リクエスト時] ↓リクエスト時 ⇒service() ⇒doGet() [Httpリクエストメソッドにより振り分け] 或は⇒doPos ...
- P、NP、NPC和NP-Hard相关概念的图形和解释
P.NP.NPC和NP-Hard相关概念的图形和解释 http://blog.csdn.net/huang1024rui/article/details/49154507 一.相关概念 P: 能在多项 ...
- Django后台邮箱配置
Django可以通过发送邮件的方式找回密码,具体细节可以看Django的文档,这里只介绍在settings.py中如何正确进行邮箱的相关配置. 网上很多教程都说了需要在settings.py里添加如下 ...
- genymotion使用学习
1 安装 直接去其官网(https://www.genymotion.com/#!/download)下载安装包安装即可,安装中会附带安装VirtualBox. 2 注册 必须使用帐号登录后,方可下载 ...
- Delphi接口的底层实现
引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...
- 14.连接池.md
目录 连接池定义 常用开源连接池: DBCP: C3P0 连接池定义 使用统一的规范:javax.sql.DataSource实现统一编程 常用开源连接池: DBCP:tomcat C3P0:hibe ...
- JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)
package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...
- Hibernate学习笔记3.3(Hibernate组建映射2)
多对多 相当于一个老师可以教多个学生,一个学生也可以有多个老师 数据表中都是再设计一个表寸相关的id 1.多对多单向 1annotation Student.java package com.bjsx ...
- shiro 会话管理
- Oracle Oracle数据库 迁移到 SQL Server上
原地址:https://blog.csdn.net/LongtengGensSupreme/article/details/81355181