多继承
所谓多继承,即子类有多个父类,并且具有它们的特征
代码为先定义一个父类
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中添加了一个属性,不改变类属性,而用静态方法调用对象时