创建类
-init-()是构造方法,开头和末尾各有两个下划线,这是一种约定,用于避免默认方法与普通方法发生名称冲突。
Python调用这个-init-()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
#__-init_-_()方法是一种特殊的方法,被称为类的初始化方法,当创建这个类的实例时就会调用该方法
# self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数
class Dog():
"""创建一个Dog类"""
def __init__(self, name, age): # 构造函数
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self): # 定义一个sit()方法
print(self.name.title() + " is now sitting.")
def roll_over(self):
print(self.name.title() + " rolled over!")
给属性指定默认值
class Dog():
"""创建一个Dog类"""
def __init__(self, name, age): # 构造函数
"""初始化属性name和age"""
self.name = name
self.age = age
self.color = 'black' # 给属性指定默认值
def sit(self): # 定义一个sit()方法
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self): # 定义一个roll_over()方法
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
创建实例
访问属性和方法
访问实例的属性和方法都使用句点表示法
my_dog = Dog('willie', 6)
"""访问属性"""
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog's is " + str(my_dog.age) + " years old.")
"""调用方法"""
my_dog.sit()
修改属性的值
直接修改属性的值
my_dog = Dog('willie', 6)
my_dog.age = 12 # 修改age属性值
通过方法修改属性的值
class Dog():
"""创建一个Dog类"""
def __init__(self, name, age): # 构造函数
"""初始化属性name和age"""
self.name = name
self.age = age
self.color = 'black' # 给属性指定默认值
def sit(self): # 定义一个sit()方法
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self): # 定义一个roll_over()方法
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
def setAge(self, age):
self.age = age
my_dog = Dog('willie', 6)
my_dog.setAge(12)
继承
Python继承的语法
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self): # 返回汽车的描述信息
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
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 an odometer!")
def increment_odometer(self, miles): # 增加汽车里程
self.odometer_reading += miles
class ElectricCar(Car): # 必须在括号内指定父类的名称
"""电动汽车的独特之处"""
def __init__(self, make, model, year): # 接受创建Car实例所需的信息
"""初始化父类的属性"""
super().__init__(make, model, year) # 帮助Python将父类和子类关联起来
my_tesla = ElectricCar("tesla", "model s", 2016)
print(my_tesla.get_descriptive_name())
定义子类时,必须在括号内指定父类的名称。
子类的方法****init()****接受创建Car实例所需的信息。
****super()****是一个特殊函数,帮助Python将父类和子类关联起来,让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。
另外,上面还为子类添加了新属性battery_size。
重写父类方法
class ElectricCar(Car): # 必须在括号内指定父类的名称
"""电动汽车的独特之处"""
def __init__(self, make, model, year): # 接受创建Car实例所需的信息
"""初始化父类的属性"""
super().__init__(make, model, year) # 帮助Python将父类和子类关联起来
self.battery_size = 70 # 给子类定义新属性
def get_descriptive_name(self): # 重写父类的方法
long_name = str(self.year) + ' ' + self.make + ' ' + self.model + ' ' + str(self.battery_size)
return long_name.title()
my_tesla = ElectricCar("tesla", "model s", 2016)
print(my_tesla.get_descriptive_name())
这里重写了父类的get_descriptive_name()方法,所以子类调用该方法时,Python将忽略Car类中的get_descriptive_name()方法。
将实例用作属性(组合)
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): # 接受创建Car实例所需的信息
"""初始化父类的属性"""
super().__init__(make, model, year) # 帮助Python将父类和子类关联起来
self.battery = Battery() # 将实例用作属性
my_tesla = ElectricCar("tesla", "model s", 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
模块化
导入单个类
from car import Car # 从car.py文件中导入Car类
从一个模块中导入多个类
from car import Car, ElectricCar # 从car.py文件中导入Car类和ElectricCar类
导入模块中的所有类
from car import * # 导入car.py文件中的所有类
实例
class Ticket():
#__init__()方法是一种特殊的方法,被称为类的初始化方法,当创建这个类的实例时就会调用该方法
# self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数
def __init__(self,checi,fstation,tstation,fdate,ftime,ttime):
self.checi=checi
self.fstation=fstation
self.tstation=tstation
self.fdate=fdate
self.ftime=ftime
self.ttime=ttime
def printinfo(self):
print("车次:",self.checi)
print("出发站:", self.fstation)
print("到达站:", self.tstation)
print("出发时间:", self.fdate)
#创建a1对象
a1=Ticket("G11","xian","beijing",'2019-01-20','13:00','18:00')
#创建a2对象
a2=Ticket("T11","xian","beijing",'2019-01-21','13:00','19:00')
a1.printinfo()
a2.printinfo()
爬取12306数据
import requests
class Station():
#__init__()方法是一种特殊的方法,被称为类的初始化方法,当创建这个类的实例时就会调用该方法
# self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数
def __init__(self,code,cn,qp,jp):
self.code=code
self.cn=cn
self.qp=qp
self.jp=jp
#类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self
def printinfo(self):
print(self.code,self.cn,self.jp,self.qp)
#self代表类的实例,表示当前对象的地址 self.__class__ 则指向类
def test(self):
print(self)
print(self.__class__)
url="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9077"
#url='https://kyfw.lesson10_1.cn/otn/resources/js/framework/station_name.js?station_version=1.9090'
html_text=requests.get(url).text
infos=html_text[:-2].split("@")[1:]
stations=[]
for info in infos:
station_list=info.split("|")
#直接将类的对象添加到列表中,通过__init__()方法接受参数
stations.append(Station(station_list[2],station_list[1],station_list[3],station_list[4]))
#遍历列表,每个元素为类的一个对象
for i in stations[:10]:
i.printinfo()
i.test()