专栏首页喵叔's 专栏第四章--第二节:类

第四章--第二节:类

类是面向对象开发中必须用到的,类就是表示现实世界中的事物和情景。

零、创建类

我们使用类前,应该创建类,创建类的方式很简单,语法如下:

class 类名称():
  类的内容

通过例子看一下,我们定义一个Cat类,类中定义一个打印名字的方法。

# 定义一个Cat类
class Cat():
  def __init__(self,name):
    """初始化name"""
    self.name=name
  def CatName(self):
    """打印出Cat的姓名"""
    print("我的猫的名字叫%s" % self.name)

在上面的代码中方法 init 是一个特殊的方法,在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初使化。另类里面的两个方法都有 self ,代表对象本身。在类中我们也看到了以 self. 开头的变量(self.name),只要是在类中见到这种形式的变量,就说明该变量可以在类中的所有方法中使用,同时也可以通过类的任何实例进行使用。

一、实例化类

既然我们已经创建了类,那么我们下一步就是使用类了,但是使用类的前提是要实例化类。实例化类的语法如下:

实例化名称=类名称([参数])

我们把刚才创建的类实例化,然后再调用其中的方法:

# 实例化Cat类,传入Cate的名字
cat=Cat("小白")
#调用方法
cat.CatName()

二、继承

当我们定义一个类的时候,可以从某个现有的类继承,新的类称为子类,而被继承的类称为基类、父类或超类。语法如下:

class 子类名称(父类名称):
  类的内容

子类继承了父类的所有操作,同时子类也可以有自己的方法或者重写父类的方法。我们把前面创建的cat类作为父类,编写一个新的cat类:

class ChinaCat(Cat):
  def __init__(self,name,age):
    """增加一个age"""
    self.name=name
    self.age=age
    super().__init__(name)

  def GetAge(self):
    print("我的猫的年龄是 %s" % self.age)

在这个新类里我们向 init 方法增加了 age 参数,并且增加了 GetAge 方法,这些方法在 Cat 类中是没有的。在我们实例化 ChinaCat 类后,即可以调用自己本身的方法,也可以调用父类的方法。我们接下来看一下例子:

chinaCat=ChinaCat("小花",1)
# 调用自己本身的方法
chinaCat.GetAge()
# 调用父类方法
chinaCat.CatName()

接下来我们再看一个例子,我们定义一个 Car 类,类中定义两个方法: StartUpShutDownCarColor ,之后再定义一个子类 ElectricCar,子类重写父类的 CarColor 方法,并定义一个自己的方法 BatteryPower ,最后我们再调用这两个类的方法。

# 定义Car类
class Car():
  def __init__(self,color):
    self.color=color

  def StartUp(self):
    print('启动引擎')

  def ShutDown(self):
    print('关闭引擎')

  def CarColor(self):
    color=self.color
    print('汽车的颜色是 %s' % color)

# 定义子类ElectricCar
class ElectricCar(Car):
  def __init__(self,color):
    self.color=color
    super().__init__(color)

  def CarColor(self,color=None):
    if color:
      self.color=color
    print('电动汽车的颜色是 %s' % self.color)

  def BatteryPower(self,battery):
    print('电动汽车电量还有 %d%%' % battery)

# 调用Car类
car=Car('蓝色')
# 启动汽车
car.StartUp()
# 输出汽车的颜色
car.CarColor()
# 关闭汽车
car.ShutDown()

# 调用ElectricCar类
e_car=ElectricCar('红色')
# 启动汽车
e_car.StartUp()
# 输出汽车颜色
e_car.CarColor()
# 输出汽车电量,每次减去10%的电量
battery=100
e_car.BatteryPower(battery)
for i in range(100,-10,-10):
  battery=i
  e_car.BatteryPower(battery)
  if i==0:
    print('电量用完了!')
    # 关闭引擎
    e_car.ShutDown()

# 定义一个新的电动汽车实例
new_e_car=ElectricCar('白色')
new_e_car.CarColor('黑色')

我们看到 ElectricCar 类重写了父类的 CarColor 方法,增加了颜色的设定,并将形参默认值设为 None ,方法体中的代码通过判断 Color 是否为 None 来决定是否使用实例化类的时候传入的颜色。

在某些情况我们不希望子类调用父类的某些方法,这时我们就可以定义以 __ 开头的方法,这样的方法被称为 私有方法,父类的私有方法在子类的实例中是无法调用。我们看一下例子:

class ClassA():
  def __init__(self):
    pass
  def __MyClassA(self):
    print('Class A')

class ClassB(ClassA):
  def __init__(self):
    super().__init__()
  def MyClassB(self):
    print('Class B')

# 实例化ClassB
b=ClassB()
# 调用ClassB的方法
b.MyClassB()
# 调用ClassAd的方法,将会报错
b.__MyClassA()

三、导入

和函数类似,我们也可以将类保存进 py文件中 ,我们习惯上会将类及其子类放在同一个 py 文件中。当在另一个文件中需要使用某一个类时,只需要导入这个类即可,导入的语法和函数一样。

四、小结

本节我们讲的比较多,这节是本教程的重中之重,无比记牢类的用法。本节课的内容我将会在这个系列的教程讲完后,在《面向对象编程》中进一步讲解。

五、作业

  1. 定义一个动物类,类中包含三个方法,分别执行:发出叫声、输出动物腿的数量和动物尾巴数量;
  2. 实例化上面定义的类;
  3. 将1中的类作为父类,扩展出几个动物的子类,并重写父类中的一个或几个方法,根据每种动物的特点扩展出各自独有的方法;
  4. 将父类的某个方法设为私有。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第三天:创建型模式--建造者模式

    创建一个由多个部分构成的对象,而且它的构成需要一步接一步地完成,只有当各个部分都创建好后,这个对象才算创建完成。

    喵叔
  • 第四天:创建型模式--原型模式

    喵叔
  • 第二天:创建型模式--抽象工厂模式

    一开始使用工厂方法,在后期需要许多工厂方法,将创建一系列对象的过程合并在一起形成抽象工厂。抽象工厂有一个优点,在使用工厂方法是从用户视角通常是看不到的,抽象工厂...

    喵叔
  • 网络端口的转发和重定向(Python)

        需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting)。

    py3study
  • python多进程打印进度条

    JNingWei
  • 探究ReactiveCocoa 底层KVO封装流程

    原文作者:溪浣双鲤 https://www.jianshu.com/p/51758229b4a5

    iOSSir
  • 探究ReactiveCocoa 底层KVO封装流程

    但是RACKVO只是用了非常简单的一段代码就实现了以上的这三个步骤,去掉了胶水代码,真正的做到了面向业务开发,那它是怎么实现的呢,接下来我们来一层层分析

    iOSSir
  • 第27天面向对象之反射,绑定方法,特定的

      类中的方法为什么要这么麻烦分这么多的类型呢?当然是有运用场景了,在写类中方法的时候具体的应用设置成绑定方法还是非绑定方法主要取决于我们方法代码中是否要用到对...

    py3study
  • Python学习——数据模型/特殊方法

    数据模型其实是对Python框架的描述,它规范了这门语言自身构架模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。简单来说,数据模型就是Py...

    陆勤_数据人网
  • vn.py入门-低买高卖示例

    本文用一个例子来介绍vnpy的用法。从项目创建开始,到一个简单策略的设计。 这个例子连接到CTP接口,每秒检查一下目标合约的价格,若低于指定价格则买入,若高于指...

    用Python的交易员

扫码关注云+社区

领取腾讯云代金券