古代编程语言简直都反对面向对象编程,面向对象编程是最无效的软件编写办法之一。你能够用类和对象来示意事实当中的任何的事物和行为。
编写类时,你会定义某一类货色通用的特色和行为。而后通过类创建对象,每个对象都主动具备这个类的特色和行为,还能够赋予每个对象独特的共性。
通过这种形式,你简直能够把看到的任何事物用代码来示意。比方咱们来形容一下“我开车去下班,车到半路没油了,于是我先加油”这个一般的场景。
在这个场景中,波及到的人和物,有“我”,“ 车 ”,“油”,这些人和物就能够通过对象来示意。我是一个人,属于人这个类,我的车属于 车这个类,油就是属于油这个类。
还有动作和行为,开车属于我的动作,加油也是属于我的动作。
出了动作和行为外,还有属性和状态,比方车没油,加完油当前,有油了。
类和对象的语法略微有点简单,要了解的确有一点难度,这也是大多数学习编程的人最初抉择了放弃。但其实只有学会把生存的当中的示例形象进去,类和对象没有想的那么难。
什么是类
类是具备独特特色和独特行为的事物的统称。 所谓人以群分,物以类聚。
类的示意 通常采纳驼峰式命名。
class Car:
pass
class Mobile:
pass
什么是对象
对象(Object)是一类事物中的一个成员(个体), object 的中文是货色,对象又被称为实例,是一个实实在在存在的货色。
- 我的车
- 你的车
- 隔壁邻居的车
通过类失去对象,这个过程叫实例化,相似函数的调用。
my_car = Car()
your_car = Car()
类和对象的关系
类就相当于建造房子时的施工图纸(blueprint),是一个模板,是负责创立房子(对象)的,通过类能够失去对象。就如同玩动物大战僵尸的游戏,上方的卡片就相当于类,拖动卡片就能够在下方的空地上失去一个对象。
my_car = Car()
car_class = Car
print(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()