天天看点

用面向对象的方式来开发python

作者:搬砖搬知识

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()
           

执行结果:

用面向对象的方式来开发python

代码只是学习交流使用,有些接口设计只是为了展示其使用的方式,实际开发可能不会这么使用,比如静态函数,类函数等。