1.类的继承
俗话说:龙生龙,凤生凤,老鼠的儿子会打洞。在古代我们的祖先就已经在大量的观察中总结出了孩子会继承父母一些特质的结论,现代的生物遗传学也确实证实了子类会表现出父类的一些特质是通过DNA的遗传,亲代会将自己的遗传物质DNA传递给后代,而且遗传的性状和物种会保持相对的稳定。遗传物质在生物进程之中得以代代相承,从而使后代具有与前代相近的性状。
这一现象在python中其实也存在,只不过它的遗传物质可不是DNA了,而是遗传自父类中的属性。下面我们用蔬菜来举例子让大家直观的感受下python的继承:
(1)继承一个类
我们先定义一个大的蔬菜类,该类里面现有两个函数,这两个函数代表了蔬菜的两种类别:植物类和菌类。之后我们又定义了蔬菜类的一个子类根菜类,这个类我们既让它继承父类蔬菜类,又在该类下定义两个函数,这两个函数代表了根菜类的一些属性:1.它是根菜类,2.它生长在土壤里。
现在我们拿出一个实例:萝卜,我们让它直接调用根菜类,然后使用根菜类中没有定义过的植物类函数,看它能否输出结果:
class Vegetable():
def plant(self):
print('它属于植物')
def fungus(self):
print('它属于菌类')
class Root(Vegetable):
def root_1(self):
print('它属于根菜类')
def soil(self):
print('它是生长在土壤中的部分')
radish=Root()
radish.plant()
radish.soil()
--------------------------------------
输出结果:
它属于植物
它是生长在土壤中的部分
Process finished with exit code 0
从输出结果可以看出我们定义的Root类它既继承了父类Vegetable中的所有函数,又保留了自己定义的函数,这在我们之后的编程工作中会很有帮助,对于那些使用频繁的函数或者是属性,我们就可以事先定义一个类出来,然后需要使用时直接继承那个类就行了。
(2)继承多个类
上面是继承了一个类的结果,那如果是继承了多个类并且继承的类中还同时有相同的函数名的话,那会出现什么结果呢?下面我们就来试试继承多个类的结果是什么吧:
不知道大家对大蒜有没有一定的了解,在大蒜的幼年时期它生长出来的蒜叶是可以食用的,我们称之为蒜苗,而当大蒜在成熟之后从植株的正中间生长出来的花茎就叫做蒜苔,当大蒜长出蒜苔之后它的蒜叶就会硬化,变成不可食用的东西。所以蒜苗和蒜苔我们只能二选一。
我们就定义一个实例:大蒜,看看同时继承蒜苗和蒜苔会出现什么结果:
class Garlic_bolt():
def eat(self):
print('年轻的大蒜,可食用蒜苗')
class Garlic_sprouts():
def eat(self):
print('成年的大蒜,可食用蒜苔')
class garlic(Garlic_bolt,Garlic_sprouts):
pass
garlic=garlic()
garlic.eat()
----------------------------------------
输出结果:
年轻的大蒜,可食用蒜苗
Process finished with exit code 0
结果很明显,年轻的大蒜打败了成年的大蒜,可食用的部分输出结果是蒜苗。这个例子说明子类在继承多个父类的函数时,如果父类有相同的函数名,则会继承排在前面的函数。在本例中garlic继承的先后顺序为先继承Garlic_bolt,后继承Garlic_sprouts,所以输出的是Garlic_bolt类中的函数。
2.私有属性
在定义函数中的属性前面加两个下划线,就代表了私有属性。私有属性不能直接被提取出来,也不能修改。
class Person():
def __init__(self,name,sex):
self.__name=name
self.sex=sex
def get_message(self):
self.name='name22'
self.sex='sex22'
author=Person('天棚漏雨','男')
print(author.__name)
----------------------------------------
输出结果:
AttributeError: 'Person' object has no attribute '__name'
Process finished with exit code 1
===========================================
class Person():
def __init__(self,name,sex):
self.__name=name
self.sex=sex
def get_message(self):
self.name='name22'
self.sex='sex22'
author=Person('天棚漏雨','男')
print(author.sex)
----------------------------------------------
输出结果:
男
Process finished with exit code 0
从输出结果可以看出同样是Person类下的属性,一个可以正常输出,一个却报出’Person’对象中没有’__name’这个属性,所以从结果能够知道__name为Person类下的私有属性,而私有属性可以通过内部的调用提取出来:
class Person():
def __init__(self,name,sex):
self.__name=name
self.sex=sex
def get_message(self):
self.name='name22'
self.sex='sex22'
return self.name,self.sex
def get_name(self):
return self.__name
author=Person('天棚漏雨','男')
print(author.get_name())
print(author.sex)
print(author.get_message())
-----------------------------------------------
输出结果:
天棚漏雨
男
('name22', 'sex22')
Process finished with exit code 0
我们在Person类内部定义一个函数get_name来提取私有属性的信息,结果终于成功输出了私有属性的信息!而对于不是私有属性的属性即公有属性,只需要直接调用就可输出信息了。所以在python中使用私有属性来保存信息有利于保护重要的数据及客户的个人隐私信息,在以后的python开发过程中记得常用私有属性哟!
以上的内容就是天棚漏雨君今天给大家分享的知识,关于类的继承和类中的私有属性的使用方法你学到了吗?