面对象编程:编写表现世界中的事物和景象的类,并基于这些类创建对象,被创建的对象称为实例化。
创建类
class Dog(): #Python中类名称中的首字母要大写 def __init__(self, name, age):#我是一个构造器 #类中的函数都称为【方法】,init__()是个特殊的方法,每当我们根据Dog类创建实例时,Python都会自动的运行它 #self必不可少且必须位于其它形参前面, # 每个与类相关的方法调用都自动传入self,self让实例能够访问类中的属性和方法 self.name = name#以【self】为前缀的变量,可供类中所有【方法】使用,也可通过【实例】访问,我们称其为【属性】 self.age = age def sit(self): #self会自动传递name与age print(self.name.title() + " is now sitting.") def roll_over(self): print((self.name.title() + " rolled over!"))
根据类创建实例
my_dog = Dog('willie',6) #根据类创建的实例名称应用小写 print("My dog's name is " + my_dog.name.title() + ".")#__init__并未显式的包含return语句,但Python自动返回了这条小狗的实例(name与age) print("My dog is " + str(my_dog.age) + " years old.")
#print(my_dog.name + my_dog.age)调用属性相加 my_dog.sit()#实例中调用方法,Python在类Dog中查找方法sit()并运行其代码 my_dog.roll_over()
根据类创建多个实例
my_dog = Dog('willie', 6) your_dog = Dog('lucy', 3) print("My dog's name is " + my_dog.name.title() + ".") print("My dog is " + str(my_dog.age) + " years old.")#实例my_dog的打印语句 print("You dog's name is " + your_dog.name.title() + ".")#实例your_dog的打印语句 print("You dog is " + str(your_dog.age) + " years old.")
属性
类中的每个属性都必须有初始值(可以是0和空字符)
class Dog(): def __init__(self, name, age): self.name = name self.age = age self.day = 0#属性day的默认值为0 def update_a(self, new): '''修改属性值的方法''' self.day = new '''禁止任何人把年龄往回调''' #if new >= self.day : # self.day = new #else : #print("返老还童?") '''对属性值进行递增''' # self.day += new my_dog = Dog('willie',6) """修改属性值""" my_dog.day = 18#通过实例直接修改 my_dog.update_a(18)#通过方法修改
继承
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法。
创建子类时父类必须包含在当前文件中,且位于子类之前,
可使用 super() 将父类与子类关联起来
from car import Car class ElectricCar(Car):#定义子类时必须在括号内指定父类名称 def __init__(self, manufacturer, model, year): super().__init__(manufacturer, model, year)#让Pyton调用父类的方法__init__(),使ElecticCar包含父类的所有属性 my_tesla = ElectricCar('teska', 'models', 2016)#使用子类创建实例 print(my_tesla.get_descriptive_name())
父类方法重写(覆盖)
在子类中定义一个与父类方法同名的方法,则Python将不会考虑父类中的这个方法,而只关注子类中定义的相应方法
将类作为属性的实例调用:
from car import Car class Battery(): def __init__(self, battery_size=60): self.battery_size = battery_size def describe_battery(self): print("This car has a " + str(self.battery_size) + "-kWh battery.") def get_range(self): if self.battery_size == 60: range = 140 elif self.battery_size == 85: range = 185 message = "This car can go approximately " + str(range) message += " miles on a full charge." print(message) class ElectricCar(Car): def __init__(self, manufacturer, model, year): super().__init__(manufacturer, model, year) self.battery = Battery()#将类用作属性 my_tesla = ElectricCar('teska', 'models', 2016) my_tesla.battery.describe_battery()#将类用作属性的实例调用
导入类模块
从一个模块中导入多个类 from car import Car, ElecticCar
导入整个模块
因为要在类名前加上模块名所以不会发生覆盖,所以需要从一个模块导入很多类时,最好导入整个模块使用。
import car my_car = car.Car('audi', 'a4', 2015)#使用car模块中的类创建实例,需要在类前加上模块名 print(my_car.get_descriptive_name()) my_car = car.ElectricCar('tesla', 'roadster', '2016') print(my_car.get_descriptive_name)
使用Python标准库collections创建有序字典
from collections import OrderedDict favorite_languages = OrderedDict()#构建对象 favorite_languages['jen'] = 'python'#为对象填入元素 favorite_languages['sarah'] = 'c' favorite_languages['edward'] = 'ruby' favorite_languages['phil'] = 'python' for name, language in favorite_languages.items(): print(name.title() + "'s favorite language is " + language.title() + ".")
from random import randint#一个很有意思的库随机生成数字 class Die(): '''一个会改变面的骰子''' def __init__(self, sides=6): '''控制面''' self.sides = sides#sides def roll_die(self): '''转骰子操作''' for a in range(0,10):#控制循环 x = randint(1, self.sides) print(x) a = Die() a.roll_die() b = Die() b.sides = 10#改变骰子面数 b.roll_die()
工作流程:
开始时应该让代码结构尽可能简单,尽可能在在一个文件中完成所有工作,再将类移到独立的模块中。
每个模块应包含一段描述,对于其中的类能做什么也应有所描述
在类中使用一个空行来分隔方法;在模块中使用两个空格来分隔类