中华5000年才出一个你,为什么不活出自我,活成自己喜欢的样子?——先去把今天活成自己不悔的样子吧。
一、创建和使用类
下面通过一个类来讲解:
class Dog():
'''一次模拟小狗的简单尝试'''
def —__init__(self,name,age):
self.name=name
self.age=age
def sit(self):
'''模拟小狗被命令坐下'''
print(self.name.title()+" is sitting now.")
def roll(self):
'''模拟小猫被命令打滚'''
print(self.name.title()+" is rolling now.")
1、首字母大写的名称指的是类。类后面括号空白。类后紧跟对这个类的描述。
2、类中的函数称为方法。__init__()是每个类都要有的方法,当你用类创建实例时,Python会自动运行这个方法。前后有下划线是为了避免与普通方法发生冲突。
3、__init__(self,name,age)中参数self必不可少,还必须位于其它参数前面。方法与其它函数的唯一区别就是多了这么个第一位置的参数。self代表类的实例,也就是当前对象的地址。而self.class则指向类的地址。
4、方法__init__()包含三个形参:self、mame 、age。 为啥必须在方法定义中包含参数self呢?因为python调用 这个__init__()方法来创建类的实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
5、例如,创建Dog()实例时,Python将调用 Dog()类方法__init__()。我们将通过实参向Dog()传递名字和年龄。self会自动传递,我们不需要传递它。每当我们根据Dog()类创建实例时,都只需给最后两个形参提供值。
6、以self为前缀的变量都可以供类中的所有方法使用。还可以通过类的实例访问这些变量。可通过实例访问的变量称作属性。
下面创建一个实例:
#这里为了简洁易看,没有复制上面的代码到这里。
my_dog=Dog('hihi',6)
print("My dog's name is "+my_dog.name.title()+".")
print("My dog is "+str(age)+" years old.")
my_dog.sit()
my_dog.roll()
在执行第一句时,_init_()方法创建一个表示特定小狗的实例,并使用我们提供的值来设置属性name 和age。方法_init_()并未显式地包含return语句,但python自动返回一个表示这个小狗的实例。这们将这个实例存储在变量my_dog()中。在这里,命名约定很有用,通常约定大写字母是类,小写字母是实例。
【注意】__init__()方法名字中,左右的下划线各是两个 _ _init_ _()
【注意】方法的里面,至少要写一个self作为默认参,如果不写会报错。
下面讲三个应用:
1、给属性默认值,这是基本
2、直接修改属性值,这是一个早期方法
3、通过方法修改属性值,这是一个值得推广的办法。
下例是给属性默认值。
class Car():
def __init__(self,make,battery=100):
self.make=make
self.battery=battery
下例是直接修改属性值:
class Car():
def __init__(self,make,battery=100):
self.make=make
self.battery=battery
car1=Car('Audi',85) #这是一种方法。
car1.battery=88 #这也是一种方法。
下面是通过函数来修改:
class Car():
def __init__(self,make,battery=100):
self.make=make
self.battery=battery
def update_battery(self):
if self.battery!=85:
self.battery=85
car1=Car('Audi')
print(car1.battery)
car1.update_battery()
print(car1.battery)
二、继承
下面写一个电动车继承车类:
class Car():
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
class Electric_Car(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery=battery
def show_battery(self):
print(self.battery)
def update_battery(self):
if self.battery!=85:
self.battery=85
继承的写法有以下几点注意:
1、把父类写在子类的参数括号里。
2、子类的初始化函数的参数要和父类相同,且,子类的初始化参数里要有super().__init__(参数)语句。
3、子类独有的属性写在初始化函数中。
4、子类新的方法直接定义即可。
还可以将实例用作属性:
class Car():
def __init__(self,make,model,year):
'''描述一个汽车'''
self.make=make
self.model=model
self.year=year
class Battery():
'''专门描述汽车的电量相关'''
def __init__(self,battery=70):
self.battery=battery
def show_battery(self):
print(self.battery)
def show_battery(self):
print(self.battery)
def update_battery(self):
if self.battery!=85:
self.battery=85
class Electric_Car(Car):
'''继承汽车类,并包含一个电量类的实例作属性'''
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery=Battery()
car1=Electric_Car('Audo','s-450',3)
car1.battery.show_battery() #注意,调用的时候是用实例的属性来调用 ,不能直接用实例来调用
三、导入类
随着不断给类中加功能,代码变得很长。为使文件更简洁,把类存储在模块中。下例展示了一个汽车类:
'''一个用于描述汽车的类'''
class Car():
def __init__(self,make,model,year):
'''初始化汽车基本属性'''
self.make=make
self.model=model
self.year=year
self.odometer=0
def get_descriptive_name(self):
'''返回整洁的描述信息'''
message=str(self.year)+' '+self.make+" "+self.model
return message.title()
def get_odometer(self):
'''打印一条信息,指出汽车的里程数'''
print("This car has "+str(self.odometer)+" miles on it.")
def update_odometer(self,mileage):
''' 将里程表设置为指定的值'''
'''拒绝将里程表往回调'''
if mileage>=self.odometer:
self.odometer=mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self,miles):
'''将里程表增加指定的量'''
self.odometer+=miles
在与上面的类同一文件夹下,再创建一个类导入汽车类,就可以使用汽车类。简洁而有效。如下:
from car import Car
#引入文件是没有.py后缀的。
#引入文件有注释一定要utf8。
#引入的类的方法后面别忘加括号。
my_new_Car=Car('audi','s-450',2016)
print(my_new_Car.get_descriptive_name())
my_new_Car.odometer=23
my_new_Car.get_odometer()