古代编程语言简直都反对面向对象编程,面向对象编程是最无效的软件编写办法之一。你能够用类和对象来示意事实当中的任何的事物和行为。

编写类时,你会定义某一类货色通用的特色和行为。而后通过类创建对象,每个对象都主动具备这个类的特色和行为,还能够赋予每个对象独特的共性。

通过这种形式,你简直能够把看到的任何事物用代码来示意。 比方咱们来形容一下“我开车去下班,车到半路没油了,于是我先加油” 这个一般的场景。

在这个场景中,波及到的人和物,有 “我”, "车", “油”, 这些人和物就能够通过对象来示意。 我是一个人,属于人这个类, 我的车属于 车这个类, 油就是属于油这个类。

还有动作和行为, 开车属于我的动作,加油也是属于我的动作。

出了动作和行为外,还有属性和状态,比方车没油, 加完油当前,有油了。

类和对象的语法略微有点简单,要了解的确有一点难度,这也是大多数学习编程的人最初抉择了放弃。 但其实只有学会把生存的当中的示例形象进去,类和对象没有想的那么难。

什么是类

类是具备独特特色和独特行为的事物的统称。 所谓人以群分,物以类聚。

类的示意通常采纳驼峰式命名。

class Car:    passclass Mobile:    pass

什么是对象

对象(Object)是一类事物中的一个成员(个体), object 的中文是货色,对象又被称为实例,是一个实实在在存在的货色。

  • 我的车
  • 你的车
  • 隔壁邻居的车

通过类失去对象,这个过程叫实例化,相似函数的调用。

my_car = Car()your_car = Car()

类和对象的关系

类就相当于建造房子时的施工图纸(blueprint),是一个模板,是负责创立房子(对象)的,通过类能够失去对象。 就如同玩动物大战僵尸的游戏,上方的卡片就相当于类, 拖动卡片就能够在下方的空地上失去一个对象。

my_car = Car()car_class = Carprint(type(my_car), type(car_class))

属性

整个类的特色,所有成员都统一,又被称为类变量。

class Car:    wheel = True    material = ["塑料", "铁", "铝合金", "橡胶"]

获取类属性

print(Car.wheel)

实例获取类属性

Car().wheel

批改类属性

Car.wheel = False

__init__ 初始化办法

*__init__* 叫初始化办法,代表一个对象产生时的初始化过程。 比方一部手机生产进去后,须要贴 logo,设计型号,壁纸,屏幕亮度。

class Mobile:    def __init__(self, brand, model, brightness):        self.brand = brand        self.model = model        self.brightness = brightness        print("Mobile 的品牌:{},型号:{},亮度:{}".format(brand, model, brightness))

这个初始化办法有点非凡,在实例化一个对象时,会主动调用这个办法。 办法的第一个参数是 self, 它是一个固定的语法,示意对象自身,其余的 brand, model, brightness 这些参数和一般的函数参数一样,改传值的时候传入理论参数就能够。

self.brand 这样的语法示意定义实例属性,当传入一个具体的参数时,就能赋值成为一个对象的属性。

初始化办法不能有返回值。

self

  • self, 我本人,这个。这个人的名字 self.name
  • self 示意在类外面对象自身。
  • 类里面定义一个变量。
  • self 能够换成其余的变量名,然而是标准,强烈不倡议更换。

    class Mobile:    def __init__(self, brand):        self.brand = brand        print(self)redmi = Mobile("redmi")print(redmi)

### 类变量和实例变量

  • 类变量和类属性一样。
  • 实例变量能够拜访类变量,
  • 类变量不能能拜访实例变量

办法(Method)

实例办法是用得最多的办法类型,个别默认状况下就是实例办法,通过实例调用。

# 初始化办法# 实例办法的定义def drive(self):    print('{} 正在开车'.format(self.name))

类办法是通过类调用的办法,能够用来作为备用的构造函数,初始化一个类。

class Dog:    def __init__(self, fullname):        self.fullname = fullname    @classmethod    def gouzao(cls, name1, name2):        return cls(name1 + name2)a = Dog('yuze')print(a)b  = Dog.gouzao('yuze','wang')print(b)

继承

继承充分发挥了面向对象的劣势,编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的非凡版本,可应用继承 。一个类继承另一个类时,将主动取得另一个类的所有属性和办法。原有的类称为父类 ,而新类称为子类 。子类继承了父类的所有属性和办法,同时还能够定义本人的属性和办法。

在写代码时,咱们能够利用他人曾经写好的类,咱们本人定义一个类继承他人写的类,就不须要从零开始写了,大大提高了代码的编写速度。

重写父类办法

如果子类想实现本人的办法,不想用父类现成的,就能够重写父类办法。

class Mobile:    def __init__(self, brand):        self.brand = brand        print(self)        def call():        print("calling")        class Iphone(Mobile):    def call():        print("Iphone Calling")

Super

如果你的重写了父类外面的一个办法,而后又想调用父类外面的一些办法,能够用超继承,咱们在单元测试外面会看到这个操作。不必去重写复制代码,轻轻松松能够做到更多继承。(理解会用即可)-super(子类名,self),依据子类找到父类。

class Animal:    def run(self):        print("我是一只动物,我在跑")class Dog(Animal):    def run(self):        super().run()        print("狗在跑")Dog().run()

失常的继承:

class Animal:    def __init__(self, type):        self.type = type    def run(self):        print("{} am running".format(self.type))        class Dog(Animal):    def __init__(self):        Animal.__init__(self, 'Dog')        a_dog = Dog()a_dog.run()