面向对象 继承 派生

函数体代码只在调用时执行 ,一但调用产生作用域,存放函数变量

对象:特征与技能的结合体  类:一系列对象相似特征与相似技能的结合体

类:相似特征与技能的结合体

类class 类名首字母大写,类在定义阶段内部代码就会执行,产生名称空间(类名.__dict__:各属性名值对的字典),内部定义的变量:数据属性 类内部定义的函数:函数属性

  class.属性名来访问属性

  class.新属性名 = ‘**‘增加了一个属性

  del class.属性名 删除属性   stu1.属性名=‘’更改一个属性

类名()实例化得到一个对象

__init__为对象定制对象自己独有的特征

加上init后实例化的步骤:产生一个空对象stu1;触发类.__init__(stu1,参数) 对象stu1是个名称空间,stu1.__dict__能够查看stu1的名称空间字典

对象stu1的增删改查与class的一样

类的数据属性是所有对象共有的,指向了同一个内存地址

类的函数属性是绑定给对象的,绑定到不同的对象是不同的绑定方法,绑定到的内存地址是不一样的,对象调用绑定方法时默认把对象本身当做第一个参数self传入

  • 站的角度不同,定义出的类是截然不同的;
  • 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
  • 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类。

python中一切皆对象,在python3中统一了类与类型的概念(定义数字 int()类产生一个数字对象)

使用类可以:将数据与专门操作该数据的功能整合到一起

定义学生类,并计算产生了多少个学生对象:

class Student():    school = "luffycity" #共同属性  数据属性    c = 0    def __init__(self,name,age,sex): #定义对象独有属性        self.name = name        self.age = age        self.sex = sex        # self.c += 1 # 去类里找 但是只每个对象独有的 互不影响 也没有更改类的c值        Student.c += 1 #更改了共有属性

def learn(self):  #函数属性        print(‘%s is learning‘%(self.name))

stu1 = Student(‘a‘,22,‘f‘)stu2 = Student(‘b‘,21,‘m‘) #实例化对象 stu1 stu2print(stu1.__dict__)print(stu2.__dict__) #打印出对象stu1 stu2的命名空间  {‘name‘: ‘b‘, ‘age‘: 21, ‘sex‘: ‘m‘} 私有属性print(Student.c) #类的属性 共有print(stu1.c)print(stu2.c) # 共有属性需要用对象去掉用查看print(stu1.school)print(stu2.school)stu1.learn()stu2.learn() #共有函数属性Student.learn(stu1) # = stu1.learn 对象调用时默认把自己当做self参数传进去

继承:class1.__bases__查看class1有哪些父类  对象查找属性:找自己- 找类-找父类-找父类的父类。。。不去全局找  类与类之间 什么是什么 的关系派生:  当子类中派生出自己的属性时以优先以自己的属性、所在的类为主

属性查找方式:对象最先,对象本身没有时子类会先于父类被检查;       多个父类会根据它们在列表中的顺序被检查;       如果对下一个类存在两个合法的选择,选择第一个父类
python2:新式类:继承object的类以及他的子类
     经典类:没有继承object的类以及他的子类  查找属性顺序:深度优先

python3:新式类 python3没有继承的类默认都继承object类 查找属性顺序:广度优先  按照__mro__列表的顺序查找经典类:新式类:

在子类派生出新方法中重用父类的方法:

  1:指名道姓 父类名.方法名() 不依赖继承

  2:super(自己类名,self).父类方法名  依赖于继承关系  super(自己类名,self)得到特殊的对象 可以调用父类属性,对象绑定方法时对象会默认把自己传到第一个参数self

    super(Garen,self).attack(enemy)       python3中可以直接用super().父类方法

    super依照子类的__mro__列表去查找父类属性 参照的是基于子类的mro列表

class A:    def f1(self):        print("from A")        super(A,self).f1()  # 虽然A没有父类 但程序基于的是类C的mro列表(C,A,B,object)去查找,所以A里调用super其实调用的是类Bclass B:    def f1(self):        print("from B")class C(A,B):    pass

c = C()c.f1()print(C.__mro__)



原文地址:https://www.cnblogs.com/ekura/p/9317836.html

时间: 2024-10-10 20:32:28

面向对象 继承 派生的相关文章

面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

继承&派生

一.什么是继承和派生 封装.继承.多态是C++的三个重要的特性.在面向对象的技术中强调软件的可重用性,而继承机制就是用来解决软件的重用问题.在C++中,所谓"继承"就是在一个已经存在的类的基础上建立一个新的类.已经存在的类成为基类或父类,新建立的类称为派生类或子类. 一个类从一个已有的类那里获得已有的特性,这种现象称为类的继承.通过继承,一个新建的子类从父类那里获得父类的特性.从另一角度说,从已有的类(父类)产生一个新的类(子类),称为类的派生.派生类继承类基的所有数据成员和成员函数,

12.面向对象(继承/super/接口/抽象类)

面向对象继承与派生继承继承顺序继承原理子类调用父类的方法(super)组合接口接口的概念:接口的概念解释和使用:python中的接口:抽象类 面向对象 继承与派生 继承 什么是继承?继承是一种创建新的类的方式 class A: pass class B(A): pass 在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或者超类,新建的类称为派生类或者子类 python中类的继承分为,单继承和多继承. 查看继承的方法B.__bases__ 如果没有指定基类,python的类会默

c++面向对象继承

1.面向对象程序设计有4个主要的特点:抽象.继承.封装.多态. 2.类和类之间的关系:包含关系:使用关系:继承关系. 3.继承的重要说明: 子类拥有父类的所有成员变量和成员函数: 子类可以拥有父类没有的成员方法和属性: 子类就是一种特殊的父类: 子类对象可以当作父类对象使用: 4.继承中的类型兼容性原则: 兼容性原则是指在需要基类的任何地方,都可以使用派生类对象来代替:通过公有继承派生类获得了基类中处构造函数.析构函数外的所有成员: 这样派生类就具备了基类的所有功能,凡是基类能解决的问题,派生类

继承派生产生的切割问题

1 #include <iostream> 2 #include <string> 3 using namespace std; 4 class people 5 { 6 public: 7 string name; 8 int age; 9 virtual void print(); 10 }; 11 12 class teacher:public people 13 { 14 public: 15 int wage; 16 virtual void print(); 17 18

(一)关于面向对象----继承

(一)关于面向对象----继承 接触面向对象许久了,对于继承这一块也确实琢磨了一段时间,搜集各种资料和网站,也未能得到使自己满意的,并能快速理解的继承知识,于是对他们归类,并得出自己的总结. 先说说继承是什么吧?也许我们最早接触有关继承的应该是"遗产"??也许电视剧看多了,总有家族为了这玩意儿整的你死我活,确实听看不下去的哈,但是对于咱大JS而言,可就变得十分和蔼,可亲.毕竟没有人来争夺,也不会有任何事故,最多来些许bug等等.废话不多说,进入正题!! 1.扩展原型对象继承:往原型对象

Php面向对象 – 继承和重写

继承: php中,通过在类上,使用特殊的操作达到目的. 通过在定义类时,利用extends来指明当前类对象继承那个类的对象. 例子: class C { public  $p_c =  "value c"; } class D extends C { public  $p_d = "value d"; } $o =  new D; var_dump($o->p_c) var_dump($o->p_d) 输出:string(7) "value c

Java面向对象㈡ -- 继承与多态

Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆盖的概念.覆盖被用来支持多态.实际开发中Java通常继承于抽象类,实现于接口.如果不希望一个类被继承,或者一个方法被覆盖,或者一个成员变量被改变,就可以用final修饰.这里只说明两个问题:1,重载和覆盖的区别重载和覆盖的区别:重载发生在同一个类之中,重载要求函数名相同,参数不同(参数个数||参数类

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函