python类的学习
前言
面向对象编程的优势最大的地方是在于可以模拟真实世界,比如将一个物品定义成一个类,此类中可以定义物品的物理属性、比如长、宽、高;还可以在类中定义动作,比如使用方法等。
一、类与实例
示例:先创建一个小狗类,可以表示任何狗狗,后面结合此类来进行类的学习。
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.__init__是干啥的,
2.里面的self是啥意思。
3.self.neme.title() 这里面的title()
1.__init__解释
1.首先__init__()是一个方法,类中的函数称为方法;
2.init()是一个特殊的方法,每当根据Dog类创建新实例时,python就会自动运行它。
至于前后两个下划线,是python为了避免与普通的方法冲突。
3.init(self,name, age)此处定义了三个形参:self、name、age(是否可以定义多个形参?应该也是可以的吧)
形参self必不可少,还必须位于其他形参的前面,为何必须在方法定义中包含形参self呢?因为python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。
小总结:init()函数把类本身的属性定义清楚,也叫构造函数。
2.类的实例化
例1:如何建立实例和如何调用类的方法
1.my_dog = Dog('whilie',6)
2.print("My dog's name is" + my_dog.name.title()+'.')
3.print("My dog is"+ str(my_dog.age) + "years old")
4.my_dog.sit() #调用
5.my_dog.rollover() #调用
1.上面代码创建了一个Dog类的实例my_dog,python会使用Dog类中的__init__()函数将name:'whilie’和age传给:my_dog()这个实例。
2.其中 title方法是python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写。 类似的方法有upper()全部大写和lower()全部小写。
3.str()是将数字转换为字符串。
例2:python也有return函数
class Car():
def __init__(self,make, model, year):
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
longname = str(self.year)+' '+self.make+' '+self.model
return longname.title() #python 也有返回函数
调用:
my_car = Car('audi','A4',2016)
print(my_car.get_descriptive_name())
1.python也有return返回函数
例3:如何对实例的属性进行修改
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):
longname = str(self.year)+' '+self.make+' '+self.model
return longname.title()
def read_odometer(self):
print('this car has ' + str(self.odometer_reading) + 'miles on it.')
def increment_odometer(self,mileage)#此处mileage只是一个形参输入
self.odometer_reading += mileage
def update_odometer(self,mileage):#此处mileage只是一个形参输入,
''' 禁止调表'''
if mileage > self.odometer_reading:#odometer_reading才是类的属性。
self.odometer_reading = mileage
#调用
my_newcar = Car('audi','a4',2017)
my_newcar.odometer_reading = 55#直接修改实例的属性
my_newcar.read_odometer()
my_newcar.update_odometer(88)#通过方法修改实例的属性。
my_newcar.read_odometer()
my_newcar.increment_odometer(100)#通过方法修改实例的属性
my_newcar.read_odometer()
1.实例中以self为前缀的变量可以供类中所有的方法使用,还可以通过类的任何实例来访问这些变量。
2.像这样可以通过实例访问的变量称为属性。
3.update_odometer(self,mileage):#此处mileage只是一个形参输入,前面不用加self。
二、类的继承
1.为何有继承的存在
新建一个类后,如果有其他类似的对象,就不需要重新新建一个类,而是借用原来的属性和方法;比如我们上面建立了一个Car类,后面再建立一个电动车的类,就可以借用Car类,因为其基本属性类似。
class Elctric_car(Car):
def __init__(self, make, model, year):
super().__init__(make,model,year)
self.battery_size = 70 #电动车专有属性 只有Elctric_car类有,Car类没有
def describe_battery(self):
print("This car has" + str(self.battery_size) + "-kwh battery")
print(self.make+self.model+str(self.year) + ' '+str(self.battery_size) + "-kwh battery")
2.重写父类的方法
如果子类与父类的方法名称一样,子类创建的实例以子类为最终结果。
def fill_gas_tunk(self):
print(“there is no gas tunk in electric cars”)
如果对电动车调用fill_gas_tunk()方法,则会执行上述print函数。
3.将实例用作属性
用代码模拟实物时,可能会发现类添加的细节越来越多,属性和方法越来越长,需要将类的一部分做为一个类提取出来,类似于再次封装。
class Battery():
def __init__(self, battery_size=70):
self.battery_size = battery_size
def describer_battery(self):
print("this car has" + str(self.battery_size)+"kwh battery")
class Elctric_car(Car):
def __init__(self, make, model, year):
super().__init__(make,model,year)
self.battery = Battery()#将实例当作用属性
#调用:
my_electric_car = Elctric_car('bmw','i8',2021)
my_electric_car.battery.describer_battery()
三、将类当做模块导入
1.两个py文件,在其中可以将另外一个py文件里面的类导入
#car.py内容如下
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):
longname = str(self.year)+' '+self.make+' '+self.model
return longname.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
def increment_odometer(self, mileage):
self.odometer_reading += mileage
#test_import.py内容如下
from car import Car#意思是从car文件中导入Car类
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
2.还可以直接导入模块
import car
my_tesla = car.Car('tesla', 'roadster', 2019)
四、总结
python最强大之处就是无比丰富的库资源,我们只要做搭积木的人就好了。