目录
面向对象
类的定义
类的方法
实例
实例属性
对象的初始化方法 __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 正常, 相关疾病发病的危险性为平均水平。