创建和使用类
class ClassName():
def _init_(self, arg):
self.arg = arg
def func_name(self):
pass
my_obj = ClassName(arg)
print(my_obj.arg)
my_obj.func_name()
- _init_() 为构造函数(方法),每次创建实例时会自动调用。
- self形参必不可少,且必须位于其他形参前面,它是一个指向实例本身的引用。
- 使用句点表示法访问实例的属性和调用方法。
使用类和实例
- 属性可以设置默认值,如果设置了默认值,就无需相应的形参。
class ClassName():
def _init_(self, arg1):
self.arg1 = arg1
self.arg2 = 0
- 修改属性的值有三种:直接通过实例修改,通过方法设置,通过方法增加特定的值。
继承
子类的_init_()
class Car():
"""docstring for Car"""
def __init__(self, make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_randing = 0
def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' +self.model
return long_name.title()
def fill_gas_tank():
print("gas tank is full.")
class E_Car(Car):
"""docstring for E_Car"""
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery_size = 70
def describe_battery(self):
print("This car has a " + str(self.battery_size) + "-kWh battery.")
def fill_gas_tank():
print("This car doesn't have a gas tank.")
my_tesla = E_Car('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
- 创建子类时,父类必须包含在当前文件中,且位于子类前面。
- 定义子类时,必须在括号内指定父类的名称,如下:
class ClassName(Parent_Class):
- super()函数用于将父类和子类关联起来,并且调用父类的方法_init_()。
- 让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法,如battery_size和describe_battery()。
- 对于父类的方法,只要它不符合子类的特性,都可以进行重写,如fill_gas_tank()。
将实例用作属性
class Car():
--snip--
class Battery():
def _init_(self, battery_size=70):
self.battery_size = battery_size
def describe_battery(self):
print("battery.")
class E_Car(Car):
def _init_(self, make, model, year):
super()._init_(make, model, year)
self.battery = Battery()
my_tesla = E_Car('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
- 在上面代码中定义了一个Battery的新类,在E_Car类中我们定义了一个self.battery的属性,同时创建一个新的Battery实例,并将实例存储在此属性中。
- 调用实例属性的方式为my_obj.attr_name.func_name()
导入类
- 为了让文件尽可能简洁,可以将类存储在模块中,然后在主程序中导入所需的模块。如:将下列代码存储在car.py文件中
class Car():
--snip--
class Battery():
--snip--
class E_Car(Car):
--snip--
- 然后创建另一个文件 my_car.py,在其中导入Car类
from car import Car, Battery
from car import E_Car
my_new_car = Car('audi', 'a4', 2016)
--snip--
my_e_car = E_Car('tesla', 'model s', 2016)
--snip--
import car
my_e_car = car.E_Car('tesla', 'model s', 2016)
--snip--
from car import *
my_e_car = E_Car('tesla', 'model s', 2016)
--snip--
在一个模块中导入另一个模块
- 有时候,需要将类分散到多个模块中,并且模块间相互依赖,这种情况下可以在前一个模块中导入另一个模块,
- 如下,将Car存在car.py中,Battery和E_Car存在e_car.py中,e_car.py需要从car.py中导入Car类
# car.py
class Car():
--snip--
# e_car.py
from car import Car
class Battery():
--snip--
class E_Car(Car):
--snip--
- 现在可以分别从各个模块中导入类,创建任何类型的汽车了,如下
from car import Car
from e_car import E_Car
my_car = Car(......)
my_e_car = E_Car(......)
--snip--
网友评论