深入浅析Python的类
面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下。
创建和使用类
classDog(): def__init__(self,name,age): self.name=name self.age=age defsit(self): print(self.name.title()+"isnowsitting.") defroll_over(self): print(self.name.title()+"rolledover!") my_dog=Dog('willie',6) print("Mydog'snameis"+my_dog.name.title()+".") print("Mydogis"+str(my_dog.age)+"yearsold.") 运行结果: Mydog'snameisWillie. Mydogis6yearsold.
class关键字:来定义一个类。类名通常首字母为大写。
__init__方法:特殊方法,每当实例类的时候都会运行。其中的形参self必不可少,而且必须位于最前面。
self形参:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候
用不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身。
实例的方法是指定类名以及需要传入的实参。
要访问实例的属性或者调用方法,可使用句点表示法。
使用类和实例
classCar(): def__init__(self,make,model,year): self.make=make self.model=model self.year=year self.odometer_reading=0#<-here defget_descriptive_name(self): long_name=str(self.year)+''+self.make+''+self.model returnlong_name.title() defread_odometer(self): print("Thiscarhas"+str(self.odometer_reading)+"milesonit.") my_new_car=Car('audi','a4',2016) print(my_new_car.get_descriptive_name()) my_new_car.read_odometer() 运行结果: 2016AudiA4
可以看到,我们给Car类的属性指定了默认值self.odometer_reading=0。如果要修改它,我们可以通过实例直接访问它并修改,比如:my_new_car.odometer_reading=23。或者通过方法修改属性的值。或者通过方法对属性的值进行递增。
classCar(): --snip-- #通过方法修改属性的值 defupdate_odometer(self,mileage): self.odometer_reading=mileage #通过方法对属性的值进行递增 defincrement_odometer(self,miles): self.odometer_reading+=miles
继承
一个类继承另一个类时,他将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
现在我们有一个Car类如下
classCar(): def__init__(self,make,model,year): self.make=make self.model=model self.year=year self.odometer_reading=0#<-here defget_descriptive_name(self): long_name=str(self.year)+''+self.make+''+self.model returnlong_name.title() defread_odometer(self): print("Thiscarhas"+str(self.odometer_reading)+"milesonit.") defupdate_odometer(self,mileage): self.odometer_reading=mileage defincrement_odometer(self,miles): self.odometer_reading+=miles
创建子类实例时,python首先给父类所有属性赋值。
接下来我们创建新类EleCar
classCar(): --snip-- classElectricCar(Car): def__init__(self,make,model,year): super().__init__(make,model,year) my_tesla=ElectricCar('tesla','models',2016) print(my_tesla.get_descriptive_name()) 运行结果: 2016TeslaModelS
首先父类必须位于子类前面。
super()是一个特殊函数,将父类和子类关联起来。使得可调用子类的父类的方法__init__(),让子类包父类的所有属性。
给子类定义属性和方法没有任何限制,比如:
classCar(): --snip-- classElectricCar(Car): def__init__(self,make,model,year): super().__init__(make,model,year) self.battery_size=70 defdescribe_battery(self): print("Thiscarhasa"+str(self.battery_size)+"-kWhbattery.") my_tesla=ElectricCar('tesla','models',2016) print(my_tesla.get_descriptive_name()) my_tesla.describe_battery() 运行结果: 2016TeslaModelS Thiscarhasa70-kWhbattery.
如果需要重写父类的方法,只需定义一个与重写的父类方法同名的方法即可。
python还可以使用其他类的实例作为自己类的属性。
导入类
类似函数,类也可以保存为.py文件形成模块从而进行导入。
导入单个类:
frommodel_nameimportclass_name
导入一个模块的多个类:
frommodel_nameimportclass_name1,class_name2
导入一个模块所有类:
frommodel_nameimport*
导入整个模块:
importmodel_name
还可以在一个模块中导入另一个模块
python标准库
其是一组模块。模块collections中有一个类OrderedDict。字典的键值对没有顺序,但是这个类几乎和字典相同,区别只在于记录了键值对的顺序。
fromcollectionsimportOrderedDict favorite_languages=OrderedDict() favorite_languages['jen']='python' favorite_languages['sarah']='c' favorite_languages['edward']='ruby' favorite_languages['phil']='python' forname,languageinfavorite_languages.items(): print(name.title()+"'sfavoritelanguageis"+ language.title()+".") 运行结果: Jen'sfavoritelanguageisPython. Sarah'sfavoritelanguageisC. Edward'sfavoritelanguageisRuby. Phil'sfavoritelanguageisPython.