python继承

python 混入类MixIn

邮差的信 提交于 2020-02-13 02:22:27
写在前面 能把一件事情说的那么清楚明白,感谢廖雪峰的官方网站。 1.为什么要用混入类?(小白入门) 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。 step1: 回忆一下 Animal 类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗; Bat - 蝙蝠; Parrot - 鹦鹉; Ostrich - 鸵鸟。 step2: 如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次: step3: 但是如果按照“能跑”和“能飞”来归类,我们就应该设计出这样的类的层次: step4: 如果要把上面的两种分类都包含进来,我们就得设计更多的层次: 哺乳类:能跑的哺乳类,能飞的哺乳类; 鸟类:能跑的鸟类,能飞的鸟类。 这么一来,类的层次就复杂了: step5: 如果要再增加“宠物类”和“非宠物类”,这么搞下去, 类的数量会呈指数增长 , 很明显这样设计是不行的 。 step6: 正确的做法是采用多重继承 。首先,主要的类层次仍按照哺乳类和鸟类设计: 2.MixIn混入类的的定义 在设计类的继承关系时,通常,主线都是单一继承下来的,例如, Ostrich 继承自 Bird 。但是,如果需要“混入”额外的功能,通过 多重继承 就可以实现,比如,让 Ostrich 除了继承自 Bird 外,再同时继承 Runnable 。这种设计通常称之为MixIn。

python学习Day18--继承

倖福魔咒の 提交于 2020-02-12 16:17:19
【知识点】 面向对象的三大特性:继承、多态、封装 【继承】 (1)继承:class Person(Animal): ——括号里的:父类,基类,超类 括号外的:子类,派生类 1 class Animal: 2 def __init__(self,name,sex,age): 3 self.name=name 4 self.sex=sex 5 self.age=age 6 7 class Person(Animal): 8 pass 9 10 p1=Person('小明','男',20) 11 print(p1.__dict__) # {'name': '小明', 'sex': '男', 'age': 20} (2)初识继承:子类以及子类实例化的对象 可以访问父类的任何方法或变量   #1、类名可以访问父类的所有东西 1 class Animal: 2 breath='呼吸' 3 4 def __init__(self,name,sex,age): 5 self.name=name 6 self.sex=sex 7 self.age=age 8 9 def eat(self): 10 print("动物都需要吃东西...") 11 12 class Person(Animal): 13 pass 14 15 print(Person.breath) # 呼吸 (用类名进行访问) 16

python面向对象编程——多态

拈花ヽ惹草 提交于 2020-02-11 22:58:36
面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则 继承 实现代码的重用 ,相同的代码不需要重复的编写 设计类的技巧 子类针对自己特有的需求,编写特定的代码 多态 不同的 子类对象 调用相同的 父类方法 ,产生不同的执行结果 多态 可以 增加代码的灵活度 以 继承 和 重写父类方法 为前提 是调用方法的技巧, 不会影响到类的内部设计 来源: CSDN 作者: 高压锅~HJ 链接: https://blog.csdn.net/u014651560/article/details/104268864

[python入门笔记--代码加详细注释]Programming with Mosh

六月ゝ 毕业季﹏ 提交于 2020-02-11 17:11:31
[python入门笔记--代码加详细注释]Programming with Mosh 原创 还有五个代码 最后发布于2019-12-03 22:43:02 阅读数 28 收藏 发布于2019-12-03 22:43:02 分类专栏: Python视频笔记 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_41950255/article/details/103376100 展开 emoji converter(知识点:字典,映射) message = input( ">" ) #用户输入消息(先右边再写左边是个好习惯) words=message. split ( ' ' ) #用空格将字符串分割(split里面的单引号或者双引号没多大影响) print (words) --执行-- >I love python so much [ 'I' , 'love' , 'python' , 'so' , 'much' ] #将空格改为o >I love you so much [ 'I l' , 've y' , 'u s' , ' much' ] message = input( ">" ) #用户输入消息 words = message.split( ' '

python __双划线 参数

感情迁移 提交于 2020-02-10 18:18:59
''' >>> Class1.__doc__ # 类型帮助信息 'Class1 Doc.' >>> Class1.__name__ # 类型名称 'Class1' >>> Class1.__module__ # 类型所在模块 '__main__' >>> Class1.__bases__ # 类型所继承的基类 (<type 'object'>,) >>> Class1.__dict__ # 类型字典,存储所有类型成员信息。 <dictproxy object at 0x00D3AD70> >>> Class1().__class__ # 类型 <class '__main__.Class1'> >>> Class1().__module__ # 实例类型所在模块 '__main__' >>> Class1().__dict__ # 对象字典,存储所有实例成员信息。 {'i': 1234} ''' class Ren(object): '''ok,it's crazy''' name = 'a human being' @staticmethod def look(): return "ok" class Men(Ren): sex = "male" class Women(Ren): sex = "female" class Baby(Women): sex = "children

python基础面试集锦(1-50)

亡梦爱人 提交于 2020-02-10 18:16:28
目录 1、Python和Java、PHP、C、C#、C++等其他语言的对比 2、简述解释型语言和编译性语言? 3、Python解释器种类以及特点? 4 、位和字节的关系? 5、b、B、KB、MB、GB的关系? 6、一个字符不同编码对应的字节数? 7、PEP8编码规范? 8、or and 计算规则 9、求结果:or and 10、ASCII、unicode、utf-8、gbk区别? 11、字节码和机器编码的区别? 12、三元运算编写格式? 13、Python2和Python3的区别? 14、一行代码数值交换?交叉赋值 15、python2和python3中Int和long的区别? 16、xrange和range的区别? 17、字符串的反转序列?步长-1切 18、文件操作时:xreadlines和readlines的区别? 19、列举布尔值位false的常见值? 20、is和==的区别? 21、那些情况下,y!=x-(x-y)会成立? 22、现有字典dict = {'a':20,'b':25,'c':10,'d':50}请按字典中的value值进行排序? 23、如何将字典的键值互换? 24、字典和json的区别? 25、什么是可变、不可变类型? 26、存入字典里的数据有没有先后排序? 27、字典推导式? 28、描述一下dict的item()方法与iteritems()的不同? 29

python 学习笔记7 面向对象编程

你说的曾经没有我的故事 提交于 2020-02-10 15:56:12
一、概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 二、创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。   类就是一个模板,模板里可以包含多个函数,函数里实现一些功能   对象则是根据模板创建的实例,通过实例对象可以执行类中的函数 #创建类 class Foo: #class 关键字,表示要创建类,Foo 类名称 #创建类中的函数 def Bar(self): #self 特殊参数,必填 #do something # 根据类Foo创建对象obj obj = Foo() class是关键字,表示类 创建对象,类名称后加括号即可 #创建类 class Dog(object): def __init__(self,name): #构造函数,构造方法 ==初始化方法 self.NAME = name def sayhi(self): #类的方法 print("hello , I am a dog. my name is", self.NAME ) def eat(self,food): print("%s is eating %s" %(self

PYTHON 类的三大特性

邮差的信 提交于 2020-02-10 08:52:09
     三大特性:封装、继承、多态 成员:   字段  静态字段(每个对象都有一份)、普通字段(每个对象都不同的数据)   方法  静态方法(无需使用对象封装的内容)@staticmethod、类方法(会自动加当前类的类名 def xxx (cls):)@classmethod、普通方法(使用对象中的数据)   特性  普通特性(将方法伪造成字段) 方法上面加@property(执行的时候不用加括号 obj.xxx)    快速判断,类执行,对象执行:   有self,对象执行   无self,类执行 补充: 查找源码的过程(self.xxxx(),从底层开始找) 执行父类的构造方式:   super(当前类,self),init()   父类.__init__(self,xxx) 面向对象常用方法 __init__ __call__  r=Foo() r() 在类里面定义了 __call__方法后就可以实现 __delitem__  del r['wqe] __getitem__ 这个方法可以用r[1]来访问对象 r[1:3]切片也可以取值 __setitem__ r['e']=213 __dict__ 可以用 类.__dict__ 展示所有类的成员 __iter__   __str__ __oo='xx' 这是成员修饰符 (在类的内部能调用,外部要通过 对象_类名__成员)

python中__getattr__和__getattribute__区别

陌路散爱 提交于 2020-02-09 20:45:46
  重载__getattr__方法对类及其实例 未定义的属性 有效。如果访问的属性存在,就不会调用__getattr__方法。这个属性的存在,包括类属性和实例属性 class ClassA: x = 'a' def __init__(self): self.y = 'b' def __getattr__(self, item): return '__getattr__' if __name__ == '__main__': a = ClassA() print(a.x)# 输出结果 a # 使用实例直接访问实例存在的属性时,不会调用__getattr__方法 print(a.y) # 输出结果 b # 使用实例直接访问实例不存在的属性时,会调用__getattr__方法 print(a.z) # 输出结果 __getattr__   __getattribute__仅在新式类中可用,重载__getattrbute__方法对类实例的每个属性访问都有效, 无论属性存不存在都会先调用__getattribute__方法 class ClassA: x = 'a' def __init__(self): self.y = 'b' def __getattribute__(self, item): return '__getattribute__' if __name__ == '_

《Python编程,从入门到实践》- 04 函数&类&文件&异常

时光怂恿深爱的人放手 提交于 2020-02-09 12:58:52
函数 def 开头+方法名+(参数) # 函数 def print_hello(name) : name = "Alice" temp = "temp" print("Hello," + name) print(num) name = "Tom" num = 15 # 这个定义是全局的 print_hello(name) # 如果上面两行互换是会报错的,仔细想想是为什么 print(name) # 打印是Tom所以说并没有被改变 # print(temp) 函数里定义的是局部的 说到函数就不的不说传参的问题。 形参和实参的问题,值传递的问题等等。 简单来说,形参就是个名字不存在具体内容,而实参是存在的。 上面函数参数里的name就是个形参,而下面调用时传入的这个name是实参。 不可变对象传的都是值,而可变对象传的是引用,这就是上面那个为什么没有变。 来看个其他的例子: class person: def __init__(self, name, address): self.name = name self.address = address def __repr__(self): # 以后再说明这个函数 return '(name:' + self.name + ', address:' + self.address + ')' def change(person):