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的学习

Python面向对象 --- 新旧式类私有方法类属性和类方法静态方法

python重写类方法

php 中文标点逗号‘,’怎么用正则匹配

哪些型号的三星智能手机缺少 html5 输入类型=“数字”的句号?

python3 之 类