(八)Python面向对象

2022-12-12 13:40:08 浏览数 (1)

目录

面向对象

类的定义

类的方法

实例

实例属性

对象的初始化方法 __init__()

类属性

继承

子类的定义与方法重写

面向对象例题 


面向对象

  • 对象(实例):由数据及能对其实施的操作所构成的封装体
  • 类 :类描述了对象的特征(数据和操作)
  • 与Java不同,Python支持多继承

类的定义

        与Java类似,所有类都是继承自object类,但是在继承父类的时候有一些不一样的地方,Python是使用参数来建立继承关系的,而Java是使用extend关键字。

具体实现如下所示:

代码语言:javascript复制
class MyDate(object):
    """this is a very simple example class"""
    pass

类的方法

        定义类的方法与Java类似,在此不做过多描述。有区别的是Python类的方法定义需要每个方法的声明中第一个参数是self,这表示调用这个方法的对象自身在调用时不需要实参跟它对应。反正感觉就是和Java的动态绑定有关联。

具体实现如下所示:

代码语言:javascript复制
class Dog(object):
    def greet(self):
        print('Hi!')

实例

实例的创建——通过调用类对象

代码如下所示:

代码语言:javascript复制
class Dog(object):  # 定义类——Dog
    def greet(self):
        print('Hi!')


dog = Dog()     # 创建一个实例——dog
dog.greet()     # 通过实例使用属性或方法——dog.greet

运行结果如下所示:

Hi!

实例属性

        个人觉得,Python里的实例属性与Java里的this关键字有相似之处,在理解上可以借助this关键字去理解。

具体实现如下所示:

代码语言:javascript复制
class Dog(object):
    def setName(self, name):
        self.name = name    # 像极了Java里的 this.name = name

    def greet(self):
        print("Hi, I am called %s." % self.name)


if __name__ == '__main__':
    dog = Dog()
    dog.setName("Paul")
    dog.greet()

运行结果如下所示:

Hi, I am called Paul.

对象的初始化方法 __init__()

        在Python中,这个__init__()方法应该就是Java中的构造方法。

具体实现如下所示:

代码语言:javascript复制
class Dog(object):
    def __init__(self, name):
        self.name = name    # 像极了Java里的 this.name = name

    def greet(self):
        print("Hi, I am called %s." % self.name)


if __name__ == '__main__':
    dog = Dog("ye")    # 构造方法的参数
    dog.greet()

类属性

  • 类的数据属性(静态成员)
  • 仅仅是所定义的类的变量
  • 在类创建后被使用
  • 可以由类中的方法来更新,也可以在主程序中更新
  • 类属性和实例无关,修改类属性需要使用类名

这个应该就是Java里的私有静态变量。

继承

        一个与Java不同的点在python支持多继承,而这个概念比较容易出问题,在此不做展开描述。

子类的定义与方法重写

大概的定义方法如下所示:

代码语言:javascript复制
class SubClassName (ParentClass1[, ParentClass2, ...]):

具体实现如下代码所示:

代码语言:javascript复制
class Dog(object):
    counter = 0

    def __init__(self, name):
        self.name = name
        Dog.counter  = 1

    def greet(self):
        print("Hi, I am %s, my number is %d" % (self.name, Dog.counter))


class BarkingDog(Dog):
    def greet(self):    # python的重写不需要加  @override
        print("Woof! I am %s, my number is %d" % (self.name, Dog.counter))


if __name__ == '__main__':
    dog = BarkingDog("Zoe")
    dog.greet()

运行结果如下所示:

Woof! I am Zoe, my number is 1

面向对象例题 

        身体质量指数(BMI,Body Mass Index)是国际上常用的衡量人体肥胖程度和是否健康 的重要标准,计算公式为:BMI=体重/身高的平方(国际单位kg/㎡)。

        (1) 定义BMI类,将身高体重作为__init__()方法的参数,在__init__()方法中计算BMI指数, 并使用printBMI()方法输出BMI指数(保留一位小数),使用具体的身高体重数据实例化。

        (2) 在上题的基础上定义 ChinaBMI子类,根据BMI指数的 中国参考标准,重写printBMI() 方法,在输出BMI指数(保留一 位小数)后输出BMI分类和相关 疾病发病的危险性信息,使用具 体的身高体重数据实例化 

BMI 分类

中国参考标准

相关疾病发病的危险性

偏瘦

<18.5

低(但其他疾病危险性增加)

正常

18.5~23.9

平均水平

偏胖

24~26.9

增加

肥胖

27~29.9

中度增加

重度肥胖

≥30

严重增加

代码如下所示:

代码语言:javascript复制
# (1)
class BMI:
    def __init__(self, height, weight):     # 构造函数
        self.bmi = weight / height ** 2
    def printBMI(self):
        print("Your BMI index is {0:.1f} ".format(self.bmi))

if __name__ == "__main__":
    h = float(input('Please enter your height(m): '))
    w = float(input('Please input your weight(kg): '))
    x = BMI(h, w)
    x.printBMI()

# (2)
class ChinaBMI(BMI):
    def printBMI(self):     # 方法重写
        print("你的BMI指数为{0:.1f} ".format(self.bmi))
        if self.bmi < 18.5:
            print("偏瘦, 相关疾病发病的危险性低(但其他疾病危险性增加)。")
        elif self.bmi < 24:
            print("正常, 相关疾病发病的危险性为平均水平。")
        elif self.bmi < 27:
            print("偏胖, 相关疾病发病的危险性为增加。")
        elif self.bmi < 30:
            print("肥胖, 相关疾病发病的危险性为中度增加。")
        else:
            print("重度肥胖, 相关疾病发病的危险性严重增加。")

if __name__ == "__main__":
    h = float(input('Please enter your height(m): '))
    w = float(input('Please input your weight(kg): '))
    x = ChinaBMI(h, w)
    x.printBMI()

运行结果如下所示:

Please enter your height(m): 1.70 Please input your weight(kg): 60.0 Your BMI index is 20.8  Please enter your height(m): 1.70 Please input your weight(kg): 60.0 你的BMI指数为20.8  正常, 相关疾病发病的危险性为平均水平。

0 人点赞