Python是一种面向对象的语言。以其中的list数据结构来说,我们知道它存在list.append(),list.remove(),list.sort()等方法。
显然,由于list结构的存在,我们可以批量的形成多个list实例,例如
A = [1,2,3]
B = [3,4,5]
显然,这里的list本质上就是一个类,而它存在很重要的一个原因就是可以将类对象进行量产。
目录
1.创建一个类
比如,这里我们写一个乌龟的类,
class Turtle():
def climb(self):
print("正在努力的向前爬")
def run(self):
print("正在努力的向前跑")
def bite(self):
print("正在努力的向前咬")
这样,我们可以将这个类进行实例化。
tt = Turtle()
进一步,可以实现方法
2.类的继承
(1)继承是基于父类构建一个子类的简便方法。例如,我们可以基于Turtle类进一步构建一个忍者神龟类(NinjaTurtle)
class NinjaTurtle(Turtle):
pass
进一步实例化,并调用Turtle属性
NT = NinjaTurtle()
需要注意的是,如果子类定义了和父类一样的方法,则会覆盖父类
class NinjaTurtle(Turtle):
def run(self):
print("忍者神龟冲刺")
(2)super继承
显然,这里的run方法的结果已经改变了。如果我们想继续调用之前方法里的一些值,可以用super方法,这里我们改写一下Turtle和NinjaTurtle
class Turtle():
def __init__(self,x = 0):
self.x = x
def climb(self):
print("正在努力的向前爬")
def run(self):
print("正在努力的向前跑")
def bite(self):
print("正在努力的向前咬")
class NinjaTurtle(Turtle):
def __init__(self):
print("我是忍者神龟")
def run(self):
print("忍者神龟冲刺")
调用的时候,结果如下
可见,NinjaTurtle中的__init__方法覆盖了Turtle中的__init__方法。如果我们想在NinjaTurtle中获得Turtle中的x值,可以这样写
class NinjaTurtle(Turtle):
def __init__(self):
super().__init__() #super继承原类的方法
print("我是忍者神龟")
def run(self):
print("忍者神龟冲刺")
这样可以调用Turtle中的x值
(3)多继承
参考以上出现的Turtle类,我们可以再构建一个Fish类
class Fish():
def swim(self):
print("正在迅速的向前划水")
def eat(self):
print("正在迅速的吃东西")
之后,我们建一个新的类,假设有一种新的生物拥有Turtle和Fish的所有方法。
class C(Turtle,Fish):
pass
我们可以看到c可以拥有Turtle和Fish的属性
但是多重继承可能会导致代码混乱,或者方法冲突,所以使用的时候要慎重。
(4)组合继承
在知道Turtle和Fish的方法后,这里如果我们想要构建一个Pool(水池),池子里有Turtle和Fish,我们可以这样写:
class Turtle:
def __init__(self,x = 2):
self.num = x
class Fish:
def __init__(self,x = 2):
self.num = x
class Pool:
def __init__(self,x,y):
self.Turtle = Turtle(x)
self.Fish = Fish(y)
def print_num(self):
print("水塘里有乌龟%s只,小鱼%s条"%(self.Turtle.num,self.Fish.num))
调用结果如下
3.类的多态
简单的说就是,不同类下相同方法返回的值不同。例如,这里我们进一步定义一个老虎类,它的方法和乌龟类是一样的,但是反应不同。
class Tiger():
def climb(self):
print("正在迅速的向前爬")
def run(self):
print("正在迅速的向前跑")
def bite(self):
print("正在迅速的向前咬")
可以看到同样是run的动作,但是tiger和turtle的行为却不一样,这就是我们所说的多态。
4.self是什么?
self 表示的就是实例对象本身,即类的对象在内存中的地址。self 是对对象本身的引用。
class Ball:
def setName(self,name):
self.name = name
def kick(self):
print("我叫%s,该死的,谁踢我.."%self.name)
进一步我们实例化
显然在kick方法一样的情况下,由于self对应的实例化对象不同,返回的参数值也不同。相当于,在每一次调用的时候将a,b分别赋值给self。
5.__init__是什么?
这里我们重写Ball类
class Ball:
def __init__(self,name):
self.name = name
def kick(self):
print("我叫%s,该死的,谁踢我.."%self.name)
赋值一个name为“土豆”,self为实例化对象a
如果没有赋值name的话,则会报错
6.变量的公有和私有
写一个类
class Person:
name = "小甲鱼"
然后我们实例化,并尝试调用name
而如果我们在name前面加两条下划线,则可以将其变为私有变量
class Person:
__name = "小甲鱼"
这时候,再调用name则会出现错误。
针对这种情况,有两种方式进行处理
一种,我们可以内置函数调用name
class Person:
__name = "小甲鱼"
def getName(self):
return self.__name
这样我们调用getName方法就好了
另一种,我们可以直接写成:
p._Person__name
来源:CSDN
作者:kunkun_1230
链接:https://blog.csdn.net/weixin_44731100/article/details/104344769