古代编程语言简直都反对面向对象编程,面向对象编程是最无效的软件编写办法之一。你能够用类和对象来示意事实当中的任何的事物和行为。
编写类时,你会定义某一类货色通用的特色和行为。而后通过类创建对象,每个对象都主动具备这个类的特色和行为,还能够赋予每个对象独特的共性。
通过这种形式,你简直能够把看到的任何事物用代码来示意。 比方咱们来形容一下“我开车去下班,车到半路没油了,于是我先加油” 这个一般的场景。
在这个场景中,波及到的人和物,有 “我”, "车", “油”, 这些人和物就能够通过对象来示意。 我是一个人,属于人这个类, 我的车属于 车这个类, 油就是属于油这个类。
还有动作和行为, 开车属于我的动作,加油也是属于我的动作。
出了动作和行为外,还有属性和状态,比方车没油, 加完油当前,有油了。
类和对象的语法略微有点简单,要了解的确有一点难度,这也是大多数学习编程的人最初抉择了放弃。 但其实只有学会把生存的当中的示例形象进去,类和对象没有想的那么难。
什么是类
类是具备独特特色和独特行为的事物的统称。 所谓人以群分,物以类聚。
类的示意通常采纳驼峰式命名。
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()