Python中的类

1、类

类的定义和实例化:

class ClassName():        # 类的定义
    def __init__(self):   # 初始化,类似构造函数
    ...

my_class = ClassName()    # 实例化

例:

class Car():				# 类名首字母通常为大写
    def __init__(self, make, year):
        self.makes = make
        self.years = year
        self.odometers = 0		# 给属性指定默认值

    def get_name(self):
        long_name = self.makes + ' ' + str(self.years) + ' ' + str(self.odometers) + ' meters'
        return long_name.title()

my_car = Car('audi', 2016)
print(my_car.get_name())

输出:

Audi 2016 0 Meters

解析:

(1)方法__init__()

特殊的方法,每当创建实例时Python都会自动调用它。该方法的名称的开头和结尾各有两条下划线

(2)self

在此方法中形参self必不可少,必须位于其他形参的前面。当调用__init__()方法来创建实例时,将自动传入实参self,不需要再传入。类的方法与普通的函数只有一个特别的区别——类方法必须包含参数 self,且为第一个参数每个与类相关的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

(3)属性

在__init__()中以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量,像这样可通过实例访问的变量称为属性。还可以在该方法中给属性指定默认值,当类在实例化的时候没传入实参,则使用该默认值。

下划线、双下划线、头尾双下划线说明:

  • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
  • _foo:以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
  • __foo:双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

Python内置类属性:

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

你可以使用以下函数的方式来访问属性:

  • getattr(obj, name[, default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
  • delattr(obj, name) : 删除属性。

2、继承

类的继承:

class SubClass(Parentclass):    # 子类SubClass继承自父类Parentclass
    def __init__(self):         
        super().__init__()      # 初始化父类的属性,此处没有self
        ...

例:类ElectricCar继承自类Car

class Battery():
    def fill_gas(self):
        print("fill gas = 120")

class ElectricCar(Car):                     # 继承自Car
    def __init__(self, make, year):
        super().__init__(make, year)        # 初始化父类的属性,此处没有self
        self.init_meters = 0
        self.battary = Battery()

    def get_name(self):                     # 重写父类方法
        print("Name = Electric Car")

my_elecCar = ElectricCar('tesla', 2016)
my_elecCar.get_name()
my_elecCar.battary.fill_gas()

输出:

Name = Electric Car
fill gas = 120

注:

(1)定义子类时,必须在括号内指定父类的名称。

(2)super()是一个特殊函数,帮助Python将父类和子类关联起来。super().__init__(make, year)让Python调用ElectricCar的父类方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名。

(3)子类重写父类的方法(同名)时,当有调用子类的该方法时,则父类的该方法不会被调用。

3、导入类

        在一个模块中(.py文件中)定义好类后则在另一个模块中可以通过导入类来使用该模块中的类。

(1)从一个模块中导入多个类

from module_name import Class0, Class1 # 导入多个类时使用逗号分隔开

my_class = Class0()                    # 实例化

(2)导入整个模块

import module_name

my_class = module_nam.Class_name()     # 实例化

(3)导入模块中的所有类

from module_name import *

注:不推荐此种方法导入模块中的所有类,可能导致名称冲突。

例:从一个模块(car.py)中导入多个类

from car import Battery,ElectricCar

my_elecCar = ElectricCar('tesla', 2016)
my_elecCar.get_name()
my_elecCar.battary.fill_gas()

例:导入整个模块(car.py)

import car

my_eleCar = car.ElectricCar('tesla', 2016)	# 实例化是需要模块名
my_eleCar.get_name()

例:导入标准库

from collections import OrderedDict         # 类似字典的类,可记录key_values添加顺序

favorite_languges = OrderedDict()

favorite_languges['Jan'] = 'Python'
favorite_languges['Phil'] = 'C'

for name, language in favorite_languges.items():
    print(name.title() + " favorite languges is " + language.title())

输出:

Jan favorite languges is Python
Phil favorite languges is C

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值