美文网首页
Python3:类

Python3:类

作者: ACphart | 来源:发表于2018-07-16 16:43 被阅读14次

    创建和使用类

    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--
    

    相关文章

      网友评论

          本文标题:Python3:类

          本文链接:https://www.haomeiwen.com/subject/uehbpftx.html