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中, ...
随机推荐
- 130. Surrounded Regions 卧槽!我半梦半醒之间做出来的。
打开这个题,做了一半躺下了. 结果,怎么都睡不着.一会一个想法,忍不住爬起来提交,要么错误,要么超时. 按照常规思路,依次对每个点检测是否是闭包,再替换,超时.计算量太大了. 还能怎么做呢?没思路,关 ...
- pod引用第三方库的几种方式
pod引用库的原理,本质上是去找.podspec文件,podspec中包含库的地址及最新的版本号(tag标签),如果pod时没有指定版本,则pod install时会去下载podspec文件中指定的最 ...
- UICollectionView setPrefetchingEnabled
UICollectionView 开启是否开启预加载,如果开启,cell在没显示的时候就回去调用cellForIndex…方法,如果没开启,cell只有在显示的时候才会去调用cellForIndex… ...
- position: relative;导致页面卡顿
1.现象: vue单页面项目 只有在某个页面切换的时候出现页面卡顿现象 经过长时间排查 确定最终原因是 该模块外层div使用 position: relative 根本原因:待完善
- golang使用Nsq(转)
为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯.一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golan ...
- easy.py使用中ValueError: could not convert string to float: svm_options错误问题解决
在使用easy.py中出现如下图所示问题 解决方法: 1.找到cmd = '{0} -svmtrain "{1}" -gnuplot "{2}" "{ ...
- indexOf实现引申出来的各种字符串匹配算法
我们在表单验证时,经常遇到字符串的包含问题,比如说邮件必须包含indexOf.我们现在说一下indexOf.这是es3.1引进的API ,与lastIndexOf是一套的.可以用于字符串与数组中.一些 ...
- python 问答
1.list和tuple有什么区别? list是可变的,可以添加list.append,可以插入list.insert,可以改变元素值list[2] ='a':而tuple在初始化的时候就确定了,不能 ...
- 删除node_modules文件夹
老版本的npm对有node_modules文件夹太长的问题,新版本就没有这个问题.2.7? npm install rimraf -g rimraf node_modules
- Python系列之 __new__ 与 __init__
很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ ...