python可以用面向对象的方式进行开发,我会通过如下代码,一次性说明白,至少对python初学者会有一定的帮助。内容如下:
1、python可以像其他面向对象语言一样,弄一个父类,然后子类继承父类的函数,也可以子类覆盖父类的同名函数。
2、子类如何调用父类的init函数,我的代码中涉及到两种方式。
3、怎么创建类对象以及调用类中的成员函数。
4、类中的成员变量其实可以直接通过实例获取,但是建议通过对外函数获取。
5、子类也可以新增自己特有的接口
6、怎样定义类函数,怎样使用类函数。
7、怎样定义静态函数以及使用静态函数。
class Animal: # 动物的父类
def __init__(self, name, num_of_legs = 0):
self.m_name = name
self.m_num_of_legs = num_of_legs
def show(self):
print(f"我是{self.m_name}, 我有{self.m_num_of_legs}条腿")
def speak(self):
print("我不知道我该说点什么?")
def get_name(self):
return self.m_name
@staticmethod
def help(i): # 静态函数
def cat_help(): # 通过该方式,方便建立索引
return "猫是..."
def dog_help():
return "狗是..."
animal = {
0 : cat_help,
1 : dog_help,
}
print(animal.get(i)())
class Cat(Animal): # 继承父类
def __init__(self, name):
super().__init__(name, 4) # 调用父类init,需要特别注意self参数
def speak(self): # 覆盖父类的接口,用自己的实现
print("喵")
class Dog(Animal): # 继承父类
def __init__(self, name):
Animal.__init__(self, name, 4) # 调用父类init,与上面的Cat调用方式不同,需要特别注意self参数
def speak(self):
print("汪")
class Duck(Animal): # 继承父类
def __init__(self, name, color):
Animal.__init__(self, name, 2)
self.m_color = color
def speak(self):
print("嘎")
def show_color(self):
return self.m_color
def show(self):
print(f"我是{self.m_name}, 我有{self.m_num_of_legs}条腿, 我全身是{self.show_color()}")
class Fish(Animal): # 该类不需要实现个性的接口,所以直接照抄父类
pass
class Zoo: #搞一个动物园
m_num_of_animal = 0
def __init__(self, name, num = 2):
self.m_name = name
self.m_animals = []
self.m_num = num
def get_name(self):
return self.m_name
def add_animal(self, animal):
if Zoo.get_num_of_animal() < self.m_num: # 调用类函数获取动物的数量
print(f"{animal.get_name()}被动物园收养")
self.m_animals.append(animal)
Zoo.add_num_of_animal() # 调用类函数修改动物的数量
return True
print(f"{animal.get_name()}没有被动物园收养,动物园需要扩建")
return False
def expand(self):
self.m_num *= 2
@classmethod
def add_num_of_animal(cls): # 类函数
cls.m_num_of_animal += 1
@classmethod
def get_num_of_animal(cls):
return cls.m_num_of_animal
def show(self):
print("动物园有:")
for animal in self.m_animals: # 很多人觉得这里能这么使用,是不是跟C++中的多态是同一个道理,其实这里只是和python的list有关,list可以存放不同类型的数据。
print(f"{animal.get_name()}")
def main():
cat = Cat("davy")
cat.show()
cat.speak()
print("--------------1-----------------")
dog = Dog("lv")
dog.show()
dog.speak()
print("--------------2-----------------")
duck = Duck("jock", "black")
duck.show()
duck.speak()
print("--------------3-----------------")
fish = Fish("little black")
fish.show()
fish.speak()
print("-------------4------------------")
zoo = Zoo("杭州野生动物园")
print(f"我在{zoo.get_name()}") # 这里其实可以直接用zoo.m_name来获取,但是不建议,最好通过封装,对外展示数据。
print("-------------5------------------")
if zoo.add_animal(cat):
pass
if zoo.add_animal(dog):
pass
if zoo.add_animal(duck):
pass
else:
zoo.expand() # 等同于zoo.m_num *= 2,但是不建议这样使用。
zoo.add_animal(duck)
if zoo.add_animal(fish):
pass
print("------------6-------------------")
zoo.show()
print("-------------7------------------")
print(f"目前动物园有{Zoo.get_num_of_animal()}只动物")
print("-------------8------------------")
Animal.help(1) # 静态函数的调用方式
if __name__== "__main__" :
main()
执行结果:
代码只是学习交流使用,有些接口设计只是为了展示其使用的方式,实际开发可能不会这么使用,比如静态函数,类函数等。