Python中的面向对象编程(类编程)由简单到复杂的示例代码

关于本文代码中的self的含义,大家可参考下面这篇博文:
https://blog.csdn.net/wenhao_ir/article/details/125384347

01-最简单的Python面向对象编程(类编程)示例代码

class Fruit:
    color = 'red'

    def taste(self):
        return 'delicious'


apple = Fruit()
a_character = apple.color
b_character = apple.taste()

print('\na_character:{}'.format(a_character))
print('b_character:{}'.format(b_character))

运行结果如下图所示:
在这里插入图片描述

02-类中的成员函数引用类的成员变量的情况

class Staff:  # Staff为员工的意思
    bonus = 30000  # bonus为津贴、奖金的意思

    def salary(self):  # salary为工资的意思
        salary = 10000+self.bonus
        return salary


zhang_san = Staff()
zhang_san_salray = zhang_san.salary()

运行结果如下所示:
在这里插入图片描述

03-带构造函数(初始化函数)的情况

class Staff:  # Staff为员工的意思
    def __init__(self, bonus):  # bonus为津贴、奖金的意思
        self.bonus = bonus

    def salary(self):  # salary为工资的意思
        salary = 10000+self.bonus
        return salary


zhang_san = Staff(3000)
zhang_san_salray = zhang_san.salary()

运行结果如下:
在这里插入图片描述

04-成员函数带参数(不包括构造函数)

class AnimalBaseClass:
    def __init__(self, num):
        self.animallegs = num
        self.head_num = 0

    def walk(self):
        print('走')

    def cry(self):
        print('叫')

    def get_legs_num(self):
        print(self.animallegs)

    def input_head_num(self, num2):
        self.head_num = num2

    def get_head_num(self):
        print(self.head_num)


animal = AnimalBaseClass(4)
animal.input_head_num(1)

animal.get_legs_num()
animal.get_head_num()

上面的代码中,成员函数input_head_num()是带了参数的。
运行结果如下:
在这里插入图片描述

05-类的继承(父类与子类)

class AnimalBaseClass:
    def __init__(self, num):
        self.animallegs = num

    def walk(self):
        print('走')

    def cry(self):
        print('叫')

    def get_legs_num(self):
        print(self.animallegs)


class BirdClass(AnimalBaseClass):
    head_num = 1

    def cry(self):
        print('吱吱叫')

    def run(self):
        print('跑')

    def get_head_num(self):
        print(self.head_num)


piyo_suke = BirdClass(2)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()

在上面的代码中,类BirdClass继承于类AnimalBaseClass,它拥有类AnimalBaseClass的变量和成员函数。
运行结果如下:
在这里插入图片描述
当父类和子类都拥有同样名称的成员函数时,子类调用这个成员函数时会优先调用子类中成员函数,这个功能叫重写(覆盖),英文中的叫法叫“override”所以上面的代码中语句

piyo_suke.cry()

的运行结果为“吱吱叫”,而不是“叫”。
不仅是一般的成员函数能被改写,构造函数也可以在子类中重写,比如下面的代码:

class AnimalBaseClass:
    def __init__(self, num):
        self.animallegs = num

    def walk(self):
        print('走')

    def cry(self):
        print('叫')

    def get_legs_num(self):
        print(self.animallegs)


class BirdClass(AnimalBaseClass):
    def __init__(self, num1, num2):
        self.animallegs = num1
        self.head_num = num2

    def cry(self):
        print('吱吱叫')

    def run(self):
        print('跑')

    def get_head_num(self):
        print(self.head_num)


piyo_suke = BirdClass(3, 1)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()

上面的代码中,子类BirdClass的构造函数和父类AnimalBaseClass不一样。
运行结果如下:
在这里插入图片描述
要注意,你的代码中用到了哪些成员变量,你在构造函数就要注意把它初始化,否则调用时会出错,比如下面这样写就不行:

class BirdClass(AnimalBaseClass):
    def __init__(self, num2):
        self.head_num = num2

    def cry(self):
        print('吱吱叫')

    def run(self):
        print('跑')

    def get_head_num(self):
        print(self.head_num)


piyo_suke = BirdClass(1)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()

上面的代码中,成员函数get_legs_num()用到了成员变量animallegs,但是没有进行初始化,所以在调用语句piyo_suke.get_legs_num()时会报下面这样的错:
在这里插入图片描述

一些与代码规范化相关的建议

在代码的书写格式上注意以下几点(非必须,但是这样书写出来的代码漂亮好看且规范):

  • 成员变量与成员函数之间要有一个空行;
  • 成员函数与成员函数之间要有一个空行;
  • 类与主体代码之间要有两个空行;
  • 类与类之间也要有个两个空行;
  • 类名用驼峰法命名(关于命名规则,可参考博文 https://blog.csdn.net/wenhao_ir/article/details/123117194);

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/125383895
今日推荐