Python 类
坚持意志伟大的事业需要始终不渝的精神。——伏尔泰
类
类是面向对象写法的基础,都是基于类来创建对象,每个对象都自动具备这种通用行为.依据类来创建对象被称为实例化
创建和使用类
- 类的起名必须要大写
创建 Dog 类
创建一个 Dog 类,每个类都将存储名字和年龄,赋予每条小狗蹲下(sit())和打滚(roll_over())
的能力
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title()+" 很听话它的年龄是 " + str(self.age)+" 我命令他蹲下 ")
def roll_over(self):
print(self.name.title()+"翻滚吧")
mydog = Dog("雷神", 30)
mydog.sit()
mydog.roll_over()
# 结果
# 雷神 很听话它的年龄是 30 我命令他蹲下
# 雷神翻滚吧
- 方法 __init__()
类中的函数称为方法,__init__这个方法就是构造函数每个类都必须要有,他就是构造函数,其中 self 必须要有,实例化的时候将自动传入实参 self.每个类实例化的时候都必须要执行。
def __init__(self, name, age):
self.name = name
self.age = age
- 根据类创建实例
我们依据类来创建实例,通过实例.xxx 来访问属性
mydog = Dog("雷神", 30)
mydog.sit()
mydog.roll_over()
- 依据类 来创建多个实例
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title()+" 很听话它的年龄是 " + str(self.age)+" 我命令他蹲下 ")
def roll_over(self):
print(self.name.title()+"翻滚吧")
mydog = Dog("雷神", 30)
mydog.sit()
mydog.roll_over()
mydog2 = Dog("蜘蛛侠", 20)
mydog2.sit()
mydog2.roll_over()
#结果
# 雷神 很听话它的年龄是 30 我命令他蹲下
# 雷神翻滚吧
# 蜘蛛侠 很听话它的年龄是 20 我命令他蹲下
# 蜘蛛侠翻滚吧
使用类和实例
创建一个类
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_description_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
myCar = Car('audi', 'a4', 2016)
print(myCar.get_description_name())
- 给属性指定默认值
就是在构造函数里面添加值
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.reading = 0
def get_description_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model + str(self.reading)
return long_name.title()
myCar = Car('audi', 'a4', 2016)
print(myCar.get_description_name())
# 结果
2016 Audi A40
- 修改属性里面的值
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.reading = 0
def get_description_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model + str(self.reading)
return long_name.title()
myCar = Car('audi', 'a4', 2016)
myCar.reading = 23
print(myCar.get_description_name())
# 结果
2016 Audi A423
也可以通过方法来修改
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.reading = 0
def get_description_name(self):
long_name = str(self.year) + " " + self.make + \
" " + self.model + str(self.reading)
return long_name.title()
def updatereading(self, number):
self.reading = number
myCar = Car('audi', 'a4', 2016)
myCar.updatereading(1345)
print(myCar.get_description_name())
# 结果
2016 Audi A41345
继承
继承就是一个类继承另一个类,他将自动获得另一个类的所有属性和方法,原有的称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还定义子的的属性和方法
通过 super().__init__ 和 class xxx(父类)来继承
- 举例
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.reading = 0
def get_description_name(self):
long_name = str(self.year) + " " + self.make + \
" " + self.model + str(self.reading)
return long_name.title()
def updatereading(self, number):
self.reading = number
class Trunk(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
def getname(self):
print("卡车的名字"+self.make)
myCar = Trunk('audi', 'a4', 2016)
myCar.updatereading(1345)
print(myCar.get_description_name())
myCar.getname()
# 结果
2016 Audi A41345
卡车的名字audi
- 重写父类的方法
可以将子类的方法和父类的方法写成重名,这样他就会执行子类方法
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.reading = 0
def get_description_name(self):
long_name = str(self.year) + " " + self.make + \
" " + self.model + str(self.reading)
return long_name.title()
def updatereading(self, number):
self.reading = number
def setname(self):
print("输出父类的名称")
class Trunk(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
def getname(self):
print("卡车的名字"+self.make)
def setname(self):
print("输出子类的名称")
myCar = Trunk('audi', 'a4', 2016)
myCar.updatereading(1345)
print(myCar.get_description_name())
myCar.getname()
myCar.setname()
# 结果
2016 Audi A41345
卡车的名字audi
输出子类的名称
- 将类拆分 用作属性
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.reading = 0
def get_description_name(self):
long_name = str(self.year) + " " + self.make + \
" " + self.model + str(self.reading)
return long_name.title()
def updatereading(self, number):
self.reading = number
def setname(self):
print("输出父类的名称")
class Mo:
def __init__(self, name):
self.name = name
def getname(self):
return self.name
class Trunk(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.name = Mo("电池").getname()
def getname(self):
print("卡车的名字"+self.make + " " + self.name)
def setname(self):
print("输出子类的名称")
myCar = Trunk('audi', 'a4', 2016)
myCar.updatereading(1345)
print(myCar.get_description_name())
myCar.getname()
myCar.setname()
# 结果
2016 Audi A41345
卡车的名字audi 电池
输出子类的名称
使用类中的变量
- 类中自己定义了变量,我们想要改变 class
class Person():
name = "YJ"
def __init__(self):
self.__class__.name = "Hello"
PersonOne = Person()
print(PersonOne.name)
导入类
- 导入方式同 导入文件
import son.PyBasic2
mycar = son.PyBasic2.Car('audi', 'a4', 2016)
mycar.setname()
- 文件中涉及到多个类 也一样
import son.PyBasic2
myCar = son.PyBasic2.Trunk('audi', 'a4', 2016)
myCar.updatereading(1345)
print(myCar.get_description_name())
myCar.getname()
myCar.setname()
myCar2 = son.PyBasic2.Car('audi', 'a4', 2016)
myCar2.setname()
# 结果
2016 Audi A41345
卡车的名字audi 电池
输出子类的名称
输出父类的名称