python——类
面向对象编程。——类
1创建和使用类
1.1创建dog类
类中的函数称为方法,方法和函数唯一重要差别为调用方法的方法。
__init__()
是一个特殊方法。当根据类Dog创建新实例时,Python都会自动运行它。
此方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免python默认方法和普通方法发生名称冲突。
方法__init__()
中的形参self必不可少,且必须位于其他形参的前面。
每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。self会自动传递。
class Dog():
"""一次模拟小狗的简单常识"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + "is now sitting.")
def roll_over(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + "rolled over.")
1.2根据类创建实例
class Dog():
"""一次模拟小狗的简单常识"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + "is now sitting.")
def roll_over(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + "rolled over.")
if __name__ == "__main__":
my_dog = Dog('xiaobai',12)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + "years old.")
- 访问属性
属性类似于一般函数中的变量
访问实例的属性使用句点表示法,访问my_dog的属性name的值:
my_dog.name
- 调用方法
类中函数即为类中方法。
if __name__ == "__main__":
my_dog = Dog('xiaobai',12)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + "years old.")
my_dog.sit()
my_dog.roll_over()
3. 创建多个实例
if __name__ == "__main__":
# 第一个实例
my_dog = Dog('xiaobai',12)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + "years old.")
my_dog.sit()
my_dog.roll_over()
#第二个实例
my_dog = Dog('dahuang',6)
print("\nYour dog's name is " + my_dog.name.title() + ".")
print("Your dog is " + str(my_dog.age) + "years old.")
my_dog.sit()
my_dog.roll_over()
2使用类和实例
2.1car类
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, modol, year):
"""初始化描述汽车的属性"""
self.make = make
self.modol = modol
self.year = year
def get_descriptive_name(self):
"""返回整洁的描述信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.modol
return long_name.title()
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
2.2给属性指定默认值
类中每一个属性都必须有初始值,哪怕这个值是0或者字符串。
如设置默认值时,在方法__init__()
内指定这种初始值是可行的;如果对某个属性这样做了,就无需包含为它提供初始值的实参。
在Car类中添加名为odometer_reading的属性,其初始值是0。
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, modol, year):
"""初始化描述汽车的属性"""
self.make = make
self.modol = modol
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""返回整洁的描述信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.modol
return long_name.title()
def read_odometer(self):
"""打印一条汽车里程的消息"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
2.3修改属性的值
2.3.1直接通过实例修改
class Car():
--snip-- # 剪贴
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
2.3.2通过方法修改属性的值
class Car():
--snip--
def update_odometer(self, mileage):
"""将里程表读书设置为指定的值
禁止将里程表读数往回调"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back the odometer.")
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(25)
my_new_car.read_odometer()
2.3.3通过方法对属性的值进行递增
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, modol, year):
"""初始化描述汽车的属性"""
self.make = make
self.modol = modol
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""返回整洁的描述信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.modol
return long_name.title()
def read_odometer(self):
"""打印一条汽车里程的消息"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mileage):
"""将里程表读书设置为指定的值
禁止将里程表读数往回调"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back the odometer.")
def increment_odometer(self,miles):
"""将里程表读数增加指定的量"""
self.odometer_reading += miles
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23500)
my_new_car.read_odometer()
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
3继承
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
3.1子类的方法__init__()
错误代码:
from car import Car
class ElectricCar(Car):
"""电车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(self, make, model, year)
错误提示:
Traceback (most recent call last):
File “F:\python\car\main.py”, line 14, in
my_tesla = ElectricCar(‘tesla’, ‘model s’, 2016)
File “F:\python\car\electric_car.py”, line 8, in init
super().init(self, make, model, year)
TypeError: init() takes 4 positional arguments but 5 were given
进程已结束,退出代码1
错误原因:继承父类属性时__init__位置参数不需要再加self
正确代码 electric.py
:
from car import Car
class ElectricCar(Car):
"""电车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(self, make, model, year)
main.py
中代码:
from car import Car
from electric_car import ElectricCar
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23500)
my_new_car.read_odometer()
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
3.2给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法
electric.py
:
from car import Car
class ElectricCar(Car):
"""电车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
"""初始化电动车特有的属性:电瓶容量"""
self.battery_size = 70
def describe_battery(self):
"""打印一条描述电瓶容量的信息"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
main.py
:
from car import Car
from electric_car import ElectricCar
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23500)
my_new_car.read_odometer()
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
3.3重写父类的方法
electric.py
:
假设Car类有fill_gas_tank方法,则在ElectricCar类中重写此方法后,使用继承时,会覆盖Car类中的方法。
在这里插入代码片from car import Car
class ElectricCar(Car):
"""电车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
"""初始化电动车特有的属性:电瓶容量"""
self.battery_size = 70
def describe_battery(self):
"""打印一条描述电瓶容量的信息"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
def fill_gas_tank(self):
"""电动车没有油箱"""
print("此车没有油箱。")
3.4将实例用做属性
定义一个新类Battery,并将Battery实例用作ElectricCar类的一个属性。
electric.py
:
from car import Car
class Battery():
"""一次模拟电动汽车的简单尝试"""
def __init__(self, battery_size = 70):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的信息"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
class ElectricCar(Car):
"""电车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
"""初始化电动车特有的属性:电瓶容量"""
self.battery_size = Battery()
def fill_gas_tank(self):
"""电动车没有油箱"""
print("此车没有油箱。")
main.py
:
from car import Car
from electric_car import ElectricCar
if __name__ == "__main__":
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23500)
my_new_car.read_odometer()
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery_size.describe_battery() ###改动之处
my_tesla.fill_gas_tank()
4导入类
和导入函数的方法类似。
4.1导入单个类
from module_name import ClassName
4.2从一个模块中导入多个类
from mudule_name import ClassName1, ClassName2, ClassName3
4.3导入整个模块
import mudule_name
## 调用类
A = mudule.ClassName1()
4.4导入模块中所有类
from module_name import *
5Python标准库
标准库为其他人员编写好的模块,可使用标准快中的任何函数和类。
6类编码风格
类名使用驼峰命名法,即类中每个单词的首字母都大写,而不是用下划线。如ElectricCar
。
实例名(变量)和模块名(单个.py文件)都用小写格式,并在单词之间加下划线。
类中使用一个空行分隔方法(函数),
在模块中用两个空行分隔类。