Python的类

为君一笑 提交于 2020-02-16 19:05:47

Python是一种面向对象的语言。以其中的list数据结构来说,我们知道它存在list.append(),list.remove(),list.sort()等方法。

显然,由于list结构的存在,我们可以批量的形成多个list实例,例如

A = [1,2,3]

B = [3,4,5]

显然,这里的list本质上就是一个类,而它存在很重要的一个原因就是可以将类对象进行量产。

目录

1.创建一个类

2.类的继承

3.类的多态

4.self是什么?

5.__init__是什么?

6.变量的公有和私有


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

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!