一、类&对象二、访问限制三、继承
如果你是以面向对象语言入门的话,听到面向对象一定会深有感慨,当好不容易搞懂了数据类型、赋值判断和循环,结果迎面就撞上了OOP。一头就扎进了公有私有保护、多态、继承、纯函数、抽象等等知识的海洋中迷失了自我。相较于面向对象语言,那么Python就是一门相对友好的语言,它在创立之初就鼓励命令交付式的轻量级编程,但随着应用的逐渐广泛,其也慢慢引入了其他语言的优秀设计之处,如面向对象!
什么是对象,什么是类?
在生活中,我们都习惯将身边的事物进行分类:
1.猪、狗、猫都是动物 2.《斗破苍穹》和《斗罗大陆》都是小说
而我们究竟是如何将这些猪、狗、猫等等归到同一类的呢?究其原因你会发现要么是某些学科专家归类总结而来。要么是大众约定俗成,具备某些特质则为什么类别。所以我们个人也可以去归类这些类别,比如:
1.动物都会跑
2.小说都有作者和有趣的情节
所以类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类!!
程序实现动物类&对象
class Animal():
# 由于类是实例的模版,所以当我们在创建实例时可以把一些我们认为必须绑定的属性强制填写进去。
# 而这个时候就需要使用到__init__这个方法,这样就可以把各种属性绑定到self,而self就指向创建的实例本身
def __init__(self, name, is_run):
self.name = name
self.is_run = is_run
def run(self):
print(f"{self.name}正在奔腾")
def is_animal(self):
if self.is_run:
print(f"{self.name}是动物")
self.run()
else:
print(f"{self.name}不是动物")
pig = Animal(name = "猪", is_run = True)
pig.name
pig.is_animal()
circle = Animal(name = "圆形", is_run = False)
circle.name
circle.is_animal()
#猪
#猪是动物
#猪正在奔腾
#圆形
#圆形不是动物
#class就是一个类,而它的实例化的结果则为对象!
#那么动物它还具备什么特质呢?学科专家的我们定义的是会跑!
二、访问限制
由上我们知道了,类就是一个共性的一个集合。而对象就是类实例化的结果,我们也可以通过这个实例化的对象去拿到里面的属性值和方法,那问题来了,如果有一些属性值或者方法,我不希望其他人直接就可以访问。那该如果解决这个权限呢?这个时候就到了我们的访问权限的了解了
# 没有权限时
pig = Animal(name = "猪", is_run = True)
pig.name = "狗"
pig.name
# '狗'
# 名称被随意修改了!如果我们不希望他人具有修改权限怎么处理呢?
# 加入权限后
class Animal():
def __init__(self, name, is_run):
self.__name = name # __ 这就开头就表示该变量变成了私有的,只能内部可以访问,外部不能访问
self.is_run = is_run
# 变量访问权限
def get_name(self):
return self.__name
# 变量修改权限
def set_name(self, new_name):
self.__name = new_name
def run(self):
print(f"{self.__name}正在奔腾")
def is_animal(self):
if self.is_run:
print(f"{self.__name}是动物")
self.run()
else:
print(f"{self.__name}不是动物")
pig = Animal(name = "猪", is_run = True)
pig.name
# 'Animal' object has no attribute 'name'
pig.get_name()
# 猪
# 这个时候我们的名称就不会随意被修改,对象实例只能具有访问权限
pig.set_name("狗")
pig.get_name()
# 狗
# 使用set_name 方法对name进行赋值,这样我们也可以对值进行更多的检查,避免传入无效的参数
那么回到面向对象的访问限制权限中,我们知道访问的权限分为三类:
public: 属性或方法可在类的外部直接访问
private: 属性或方法,只能在该类中访问
protected: 属性或方法,只能在类或其派生类中访问
而在python中分别对应着:(public)默认情况、(private)两个下划线开头(__)、(protected)一个下划线开头个(_)。但是python中一个下划线的实例变量外部是可以访问的,所以这个更多是约定俗成的规矩。
三、继承有富二代梦想的继承。什么是继承,小时候你可能经常会听到,你与你父母好像呀。而这就是继承最好的诠释,你继承了你父母的特征。而接着我们上面定义的程序我们知道动物这一个类中包含了猪这个种类。而我们知道猪这一种类中还包含有荷兰猪、大白猪、皮特兰猪等等品种。
假定我们现在规定动物都会蹦腾,猪都有猪鼻子,那如果我要定义出荷兰猪、大白猪、皮特兰猪难道我还要把奔腾和猪鼻在各个猪中在定义一遍嘛?所以我们继承也就闪亮登场了
class Animal(object):
def run(self):
print("奔腾ing")
class Pig(Animal):
def pig_nose(self):
print("拥有猪鼻子")
class Guinea(Pig):
pass
guinea = Guinea()
guinea.run()
guinea.pig_nose()
#奔腾ing
#拥有猪鼻子
其上可以看出荷兰猪什么也没干只是通过了继承就得到了父类中方法的使用!那第二个问题:如果猪在蹦腾的时候希望有自己的一些特色。该如何解决呢?跑出自己的特色,也就是我们继承的多态形式。
class Animal(object):
def run(self):
print("奔腾ing")
class Pig(Animal):
def pig_nose(self):
print("拥有猪鼻子")
def run(self):
print("别样奔腾ing")
class Guinea(Pig):
pass
guinea = Guinea()
guinea.run()
guinea.pig_nose()
#别样奔腾ing
#拥有猪鼻子



