类的继承
一个类如果继承了另一个类,那么子类可以拥有父类的方法和属性
格式为:
class 子类名(父类名):
xxxxx
比如一个类继承list这个类
class Mylist(list):
pass
#pass表示这个类什么都不干,相当于一个空代码块
list1=Mylist((14,3,6,1,7))
list1.sort()
这么一来Mylist类也有list的方法了
如何调用父类的方法:
a. 父类类名.方法名(self,p1,p2,p3,...) 这里面的self就是子类的实例对象而非父类的实例对象了
b. super().方法名(p1,p2,...) 而且不用传self
而且python支持多继承
class 子类(父类1,父类2,父类3,...):
但是要尽量避免多继承。
class WaterAnimal:
num=0 #表示初始化多少只水生动物
def __init__(self,num):
self.num=num
class Turtle(waterAnimal):
pass
class Fish(waterAnimal):
pass
class Pool:
fish=None
turtle=None
def __init__(self,x,y):
self.fish=Fish(x)
self.turtle=Turtle(y)
def info(self):
print("水中有%s只乌龟和%s只鱼" % (self.fish.num,self.turtle.num))
pool=Pool(5,10)
pool.info()
像这种将一个对象作为属性存在另一个对象中的做法就叫做组合
继承是纵向关系
组合是横向关系
类对象
所谓的类对象,就是不实例化类,而直接使用类来调用方法和属性
class Demo:
count=0
def addCount(self):
self.count++
a=Demo()
b=Demo()
c=Demo()
c.count=10
Demo.count=100 #这里直接使用类来调用修改属性
此时a.count和b.count都是100,但是c.count还是10
从上面例子可以看出,定义出来的属性既可以让对象调用,也可以用类调用
用类修改属性时不会改变用对象修改的属性值,但是对象未修改过属性值则会改变所有对象的属性值
所以用类来修改属性值相当于一种初始化的作用
但是,如果使用过类调用addCount方法则要传入对象作为参数
C.addCount(a)
此时a的count属性加1,其他对象的不变
还有 属性名不能和方法名重复,否则会属性会覆盖掉方法。这样这个方法就不存在了
你再去调用这个方法的时候就会报错
因此要遵循属性用名词命名,方法用动词命名
和类相关的函数:
issubclass(类1,类2) #判断类1是否是类2的子类,第二参如果放入元组,里面放入多个类,那么只要有一个类是类1的父类都算true
例如:
class A :
pass
class B(A) :
pass
issubclass(B,A) #返回True
issubclass(B,B) #返回True
issubclass(B,object) #返回True,object是所有类的基类
isinstance(对象,类) #判断对象是否是类的实例化对象,如果第一参不是个对象而是个类,就会返回false
isinstance(b,B) #True
isinstance(b,A) #True
hasattr(对像,属性) #判断一个对象是否有某属性,第二参要加引号哦
getattr(对象,属性[,默认值]) #访问某个属性,不存在就可以赋值个默认值
setattr(对象,属性名,值) #在类之外添加或者修改属性值
delattr(对象,属性名) #干掉一个属性,不存在则报错
重写:
如果你想重写一个类,重写里面的一个或者几个方法
你可以定义一个类,类名和你要重写的那个类同类名
然后让这个类继承自己:这么一来,你只要重写你要重写的方法,其他方法统统继承不变
class A(A):
.....