继承介绍及单继承

1.继承示列

#定义一个父类

class  Cat(object):

def __init__(self,name,color='白色')

self.name = name

self.color = color

def run(self):

print('%s--在跑'%self.name)

#定义资格子类,继承Cat类如下:

class Bosi(Cat):

def setNewName(self,newName):

self.name=newName

def eat(self):

print('%s--在吃'%self.name)

bs = Bosi('印度猫')

print ('bs的名字是:%s'%bs.name)

print ('bs的颜色是:%s'%bs.color)

bs.eat()

bs.run()


运行结果:

说明:

·虽然子类没有定义__init__方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__方法

总结

·子类在继承的时候,在定义类时,小括号()中为父类的名字

·父类的属性、方法,会被继承给子类



2  注意点





总结

·私有的属性,不能通过对象直接访问,但是可以通过方法访问

·私有的方法,不能通过对象直接访问

·私有的属性、方法,不会被子类继承,也不能被访问

·一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用

3 多继承

所谓多继承,即子类有多个父类,并且具有它们的特征



说明

·python中是可以多继承的,在java中叫接口

·父类中的方法、属性,子类会继承

如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?




4.重写父类

所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法


调用父类的方法

5多态

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态



·Python “鸭子类型”


6类属性、实例属性

直接在类中定义的,与方法平齐,不在方法里的属性就是类属性

在方法里通过self.属性都是实例属性

在了解了类基本的东西之后,下面看一下python中这几个概念的区别

先来谈一下类属性和实例属性

在前面的例子中我们接触到的就是实例属性(对象属性),顾名思义,类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问

类属性


实例属性(对象属性)


通过实例(对象)去修改类属性


·总结

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。


静态方法和类方法

类方法

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。

1、头部是@classmethod

2、必须写参数,第一个是类变量,一般写cls

3、通过类对象.类方法(参数),第一个参数是类变量,会自动传参,用户只需要传递后面的参数



静态方法

1、头部是@staticmethod

2、对参数没有要求

3、类对象.静态方法(参数),参数不会自动赋值


总结

从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1面向对象 面向对象(object-oriented ;简称: OO)至今还没有统一的概念 我这里把它定义为:...
    TENG书阅读 3,641评论 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,463评论 1 10
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 6,878评论 1 6
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,523评论 0 6
  • 【日精进打卡第2天】 【知-学习】 《六项精进》诵读1遍,共2遍。 《大学》诵读2遍,共3遍。 【经典名句分享】 ...
    玉_莲子阅读 1,040评论 0 0

友情链接更多精彩内容