面向对象

多继承

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

代码为先定义一个父类

classA:

defprintA(self):

print('----A----')

再定义一个父类(-.-!)

classB:

defprintB(self):

print('----B----')

定义子类

lassC(A,B):

defprintC(self):

print('----C----')

这里面的子类就可以继承两个父类,并且自己可以添加自己的函数方法

如果子类调用父类方法,而父类被调用的方法重复了,那么就会调用第一个父类的方法

在子类中父类方法里面的方法也可以调用,是一级一级向上找的,比方父类方法a里面有个其他类的方法b,子类c如果想调用c,就可以直接在父类里面实现

子类重写覆盖父类

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

子类中如果有父类方法,就会直接覆盖父类的方法

如果就只想调用父类的方法,可以在子类虫谷方法的后添加super().__init__(name)格式

多态

Python(鸭子语言)

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”表明python是弱类型语言,不需要定义类型

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

·Python “鸭子类型”

‘’’

python是一种弱类型语言,没有类型限制。

变量的类型永远是通过右侧的值判断的。

方法中的参数,传递任何值都行。但是要考虑方法内部的业务逻辑。

多态:

1、父类作为参数,可以传递父类和子类对象

2、接口作为参数,只能传递实现对象

所以有两种理解:

1、python不支持多态:

python是弱类型,没有类型限定,无法区分父和子,或者说接口和实现类

2、python处处是多态

python是弱类型,没有类型限定,传递任何内容都行

类属性和实例属性

类属性

就是公有的方法里面的属性,没有被self定义

实例属性

就是被定义值的属性,在对象里面被定义self特定值

class People(object):

country = 'china' #类属性

print(People.country)

p = People()

print(p.country)

p.country = 'japan'

print(p.country)      #实例属性会屏蔽掉同名的类属性

print(People.country)

del p.country    #删除实例属性

print(p.country)

在调用类方法时候,对象会自己创建一个环境把类方法的地址复制进去,当你做修改的时候,修改的只是对象里面的函数,不影响类方法

静态方法和类方法

类方法@classmethod方法里面尽量写(cls)

可以通过实例对象和类对象都可以访问方法

class People(object):

country = 'china'

@classmethod

def getCountry(cls):

print(type(cls))

print(cls)

return cls.country

p = People()

p.country=1

print(p.getCountry())

print People.getCountry()

在例子中,不管调用的是类方法还是实例方法都打印的是china

他们的指向都是一样的,都指向__main__.People

类方法可以用来修改类属性

class People(object):

country = 'china'

@classmethod

def getCountry(cls):

return cls.country

@classmethod

def setCountry(cls,country):

cls.country = country

p = People()

print(p.getCountry())

print(People.getCountry())

p.setCountry('japan')

print(p.getCountry())

print(People.getCountry())

Setmethod中的cls是用来修改getCountry中的cls值,而此cls值等同于类属性people里面的country = 'china',所以把country进行了修改

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

静态方法

需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数

class People(object):

country = 'china'

__num = 100

@classmethod

def getCountry(cls):

return cls.country

@staticmethod

def myStaticMethod():

print('myStaticMethod...')

print(People.__num)

p = People()

p.country=1

print(p.getCountry())

print(People.getCountry())

print(p.myStaticMethod())

print(People.myStaticMethod())

此方法中p.country=1是在p中添加了一个属性,不改变类属性,而用静态方法调用对象时

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

相关阅读更多精彩内容

  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 4,103评论 0 13
  • Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类...
    chen_000阅读 832评论 2 2
  • 1.1面向对象 面向对象(object-oriented ;简称: OO)至今还没有统一的概念 我这里把它定义为:...
    TENG书阅读 636评论 0 0
  • 从8月24日下午去学校,到9月2日你回家,其实不过九天的时间。可对于你来说,已经很长了。27日去给你送饭...
    月光墨墨阅读 519评论 2 2
  • 8月13日在成都地铁扶梯上,一位暖男在后面为一位被背篓压弯了腰的阿姨拎起了背篓,减轻阿姨的负担。新闻发出后,网友都...
    聘婷时光阅读 445评论 0 0

友情链接更多精彩内容