Python ❀ 类
Posted 无糖可乐没有灵魂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python ❀ 类相关的知识,希望对你有一定的参考价值。
文章目录
1、创建与使用
使用类可以模拟任何对象,根据类创建对象被称为实例化;
1.1 创建一个简单的类
根据Dog类创建的每一个实例都将存储名字与年龄,并赋予其sit( )与roll( )能力;
class Dog():
# 上面类Dog的一个详细描述,以展示其功能0
def __init__(self,name,age):
# 解释第一个方法
self.name = name
self.age = age
def sit(self):
# 解释第二个方法
print(self.name.title() + "is now sitting")
def roll(self):
# 解释第三个方法
print(self.name.title() + "is now roll")
在Python中,首字母大写的名称指的是类,上述类的定义括号内容为空,需要从空白创建这个类;
类中的函数称之为方法,所有对于函数的限制都适用于方法,方法与函数的唯一区别就是调用方式不同; 代码中__init__()是一个比较特殊的方法,当你根据Dog类创建新实例时,Python会自动运行它,在这个方法的名称中,前后均有两个下划线,这是一种Python规范,意在避免Python默认方法与普通方法发生名称冲突而导致其失效;
方法__init__()中定义了包含三个形参:self、name、age;形参self必须存在且在其他参数前面,Python调用方法__init__()来创建Dog实例时,自动传入实参self,每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性与方法;当创建Dog实例时,Python将调用Dog类的方法__init__(),通过实参向Dog()传递名字与年龄,self会自动传递,因此不需要传递它,每当根据Dog类创建实例时,都只需要给最后两个形参提供具体的值即可;
self.name = name定义两个变量都有前缀self,以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量,self.name = name获取存储在形参name中,然后变量被关联到当前创建的实例中;像这样可以通过实例访问的变量被称之为属性;
Dog类还定义了两个方法sit()与roll(),由于这些方法不需要额外的信息,因此它们只有一个形参self,后面将创建的实例能够访问这些方法;
1.2 根据类创建实例
可将类视为有关如何创建实例的说明;
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + "is now sitting")
def roll(self):
print(self.name.title() + "is now roll")
my_dog = Dog("a",10)
print("My dog name is " + my_dog.name)
print("my dog age is " + str(my_dog.age))
输出结果:
My dog name is a
my dog age is 10
这里使用的是前面示例中的Dog类,首先创建了一条名字为a,年龄为10的小狗对象,遇到这行代码时,Python使用实参a与6调用Dog类中的方法__init__(),方法__init__()创建一个表示特定小狗的示例,并使用提供的值来设置属性name与age;方法__init__()并未显示的包含return语句,但是Python自动返回一个表示这条小狗的实例,将这个实例存储在my_dog变量中(通常情况下,以大写字母开头的名称代表类,全小写名称指类创建的实例);
1.2.1 访问属性
若要访问实例的属性,需要使用句号表示法;如前面的my_dog.name与my_dog.age,这种语法演示了Python如何获悉属性的值,Python首先找到实例my_dog,再查找与这个实例相关联的属性name,在Dog类中引用这个属性时,使用的是self.name;
1.2.2 调用方法
根据Dog类创建实例后,就可以使用句号表示法来调用Dog类中定义的任何方法;
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + " is now sitting")
def roll(self):
print(self.name.title() + " is now roll")
my_dog = Dog("a",10)
my_dog.sit()
my_dog.roll()
输出结果:
A is now sitting
A is now roll
要调用方法,可以指定实例的名称和要调用的方法,并用句号分隔它们;遇到代码my_dog.sit()时,Python在Dog类中查找方法sit()并运行其代码返回结果;
1.2.3 创建多个实例
可以安装需求根据类创建人员数量的实例;
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + " is now sitting")
def roll(self):
print(self.name.title() + " is now roll")
my_dog = Dog("a",10)
you_dog = Dog("b",12)
my_dog.sit()
my_dog.roll()
print("you dog name is " + you_dog.name)
输出结果:
A is now sitting
A is now roll
you dog name is b
2、类和实例
当类编写完成后,大部分时间都将花费在使用根据类创建实例上,需要执行一个重要任务是修改实例的属性;
2.1 创建一个类
下面编写一个类,用于后面的实验;
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
def get_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
if __name__ == '__main__':
my_car = Car("BMW","A4",2016)
print(my_car.get_name())
输出结果:
2016 BMW A4
首先定义了方法__init__(),第一个形参为self,另外三个形参:make、model、year;方法__init__()接受这些形参的值,并将它们存储在根据这个类创建的实例的属性中,创建新的Car实例时,需要指定这三个形参的值;接下来定义了一个名称为get_name()的方法,它使用属性year、make、model创建一个对汽车进行描述的字符串;
2.2 给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是0或者为空,某些情况下,如果设置默认值,方法__init__()内指定这种初始默认值是可行的;
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odo = 0
def get_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
def read_odo(self):
print("None!" + str(self.odo))
if __name__ == '__main__':
my_car = Car("BMW","A4",2016)
print(my_car.get_name())
my_car.read_odo()
输出结果:
2016 BMW A4
None!0
2.3 修改属性的值
在Python中可以使用三种方式修改属性的值,下面将依次介绍这三种方法;
2.3.1 直接修改属性的值
可以使用句号表示法直接访问并设置汽车的属性;
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odo = 0
def get_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
def read_odo(self):
print("None!" + str(self.odo))
if __name__ == '__main__':
my_car = Car("BMW","A4",2016)
print(my_car.get_name())
# 直接修改属性的值
my_car.odo = 23
my_car.read_odo()
输出结果:
2016 BMW A4
None!23
2.3.2 通过方法修改属性的值
添加一个方法updata_odo(),定了一个形参,关联到我们需要修改的属性,并最终调用此函数并赋予其一个实参即可;
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odo = 0
# 添加新方法,修改属性的值
def update_odo(self,new_odo):
self.odo = new_odo
def get_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
def read_odo(self):
print("None!" + str(self.odo))
if __name__ == '__main__':
my_car = Car("BMW","A4",2016)
print(my_car.get_name())
# 以函数的方法进行修改属性的值
my_car.update_odo(23)
my_car.read_odo()
输出结果:
2016 BMW A4
None!23
2.3.3 通过方法对属性的值进行递增
特殊情况下需要将属性值递增特定的量,而不是将其设置为全新的某个值;
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odo = 0
def update_odo(self,new_odo):
self.odo = new_odo
#添加一个新方法,以递增的方法修改属性的值
def incr_odo(self,miles):
self.odo += miles
# self.odo += miles 等同于 self.odo = self.odo + miles
def get_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
def read_odo(self):
print("None!" + str(self.odo))
if __name__ == '__main__':
my_car = Car('BMW','outback',2020)
print(my_car.get_name())
my_car.update_odo(200)
my_car.read_odo()
my_car.incr_odo(300)
my_car.read_odo()
输出结果:
2020 BMW outback
None!200
None!500
新增一个方法incr_odo(),用来以递增的方式修改属性self.odo的值,当self.odo为0时,首先修改为200,其次在200的基础上增加300,即返回500;
3、继承
编写类时,并非总是从空白开始,如果需要编写的类是一个现成类的一个特殊版本,可以使用继承;一个类继承另一个类,它将自动获得另一个类的所有方法与属性;原有的类称为父类,而新类称为子类;子类继承了父类的所有属性与方法,同时也支持定义自己的属性与方法;
3.1 子类的方法__init__( )
创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值,为此,子类的方法__init__()需要父类进行限制;下面用一个案例进行说明:
class Car():
~
class ElectricCar(Car):
def __init__(self,make,model,year):
# 初始化父类的属性
super().__init__(make,model,year)
#子类调用父类Car的__init__方法
if __name__ == '__main__':
my_elcar = ElectricCar('tesla','s','2020')
print(my_elcar.get_name())
输出结果:
2020 tesla s
首先Car类的代码创建子类时,父类必须包含在当前文件中,且位于子类前面;当定义了子类ElectricCar时,必须在括号内指定父类的名称,方法__init__()接受创建Car实例所需的信息;
super()为一个特殊函数,帮助Python将父类和子类关联起来,让Python调用ElectricCar父类的方法__init__(),让ElectricCar实例包含父类的所有属性,父类也称之为超类,super函数因此而来;
为了测试这一结果,将创建一个ElectricCar的实例,并将其存储在变量my_elcar中;当这行代码调用ElectricCar类中的__init__()方法时,后者调用父类Car中定义的方法__init__(),从而提供了实参的值;
3.2 Python 2.7版本中的继承
函数super()需要两个参数:子类名称与对象self;在Python 2.7中必须在定义父类时在括号内指定object;
class Car(object):
#指定object
~
class ElectricCar(Car):
def __init__(self,make,model,year):
super(ElectricCar,self).__init__(make,model,year)
# super函数指定子类名称与对象self
3.3 给子类定义属性和方法
让一个类继承另一个类后,可以添加区分子类和父类所需的新属性和方法;
下面以添加子类特有的属性,以及一个描述该属性的方法进行说明:
class Car():
~
class ElectricCar(Car):
def __init__(self,make,model,year):
# 初始化父类的属性
super().__init__(make,model,year)
# 子类添加一个新属性
self.size = 70
# 子类添加一个新方法用来描述新创建的属性
def battery(self):
print("this car has a " + str(self.size) + "-kWh battery")
if __name__ == '__main__':
my_elcar = ElectricCar('tesla','s','2020')
print(my_elcar.get_name())
# 调用子类创建的新方法
my_elcar.battery()
输出结果:
2020 tesla s
this car has a 70-kWh battery
3.4 重写父类的方法
对于父类的方法,只要不满足子类的要求就可以对其进行重写;因此可以在子类中定义一个同名的方法,以此来替换掉父类的方法;
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odo = 0
def update_odo(self,new_odo):
self.odo = new_odo
def incr_odo(self,miles):
self.odo += miles
#父类的方法
def get_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
def read_odo(self):
print("None!" + str(self.odo))
class ElectricCar(Car):
def __init__(self,make,model,year):
# 初始化父类的属性
super().__init__(make,model,year)
self.size = 70
# 子类创建一个与父类同名的方法,并修改其执行结果
def get_name(self):
print("this is change")
def battery(self):
print("this car has a " + str(self.size) + "-kWh battery")
if __name__ == '__main__':
my_elcar = ElectricCar('tesla','s','2020')
my_elcar.get_name()
输出结果:
this is change
当子类与父类拥有同名的方法时,调用结果为子类的代码,可以使用此方法修改所有子类无法契合的所有父类方法;
3.5 将实例用作属性
使用代码模拟实物时,就会发现给类添加的属性与方法会越来越多,在这种情况下就可以将部分属性作为一个单独的类提取出来(将一个大类拆分成多个小类);
class Car():
~
# 创建一个新类,没有继承父类
class Battery():
def __init__(self,battery_size=70):
# 属性初始化,定义默认实参
self.battery_size = battery_size
def desc_battery(self):
print("this is " + str(self.battery_size) + "-kWh")
class ElectricCar(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
# 创建一个新的实例,将实例内容存储在属性self.battery中
self.battery = Battery()
def get_name(self):
print("this is change")
def battery(self):
print("this car has a " + str(self.size) + "-kWh battery")
if __name__ == '__main__':
my_elcar = ElectricCar('tesla','s','2020')
my_elcar.battery.desc_battery()
输出结果:
this is 70-kWh
下面再给Battery类添加一个方法,详细描述续航能力;
class Car():
~
class Battery():
def __init__(self,battery_size=70):
self.battery_size = battery_size
def desc_battery(self):
print("this is " + str(self.battery_size) + "-kWh")
# 添加一个新方法
def get_range(self):
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270
print("this is car can go " + str(range) + "miles")
class ElectricCar(Car):
def __init__(self,make,model,year):
# 初始化父类的属性
super().__init__(make,model,year)
self.battery = Battery()
def get_name(self):
print("this is change")
def battery(self以上是关于Python ❀ 类的主要内容,如果未能解决你的问题,请参考以下文章
Python面向对象 --- 新旧式类私有方法类属性和类方法静态方法