1.面向过程与面向对象
面向过程
面向过程主要是注重于程序的运行逻辑。在遇到一些小项目时,我们去思考怎么让程序按步骤的去完成此项目,再将这些步骤转换为实质性的代码,这就是面向过程的编程方式。
例如:如何启动一台电脑
①连接电源
②按开机键
③输入密码
面向对象
python中一切皆对象(数据类型、序列、函数、类等皆为对象),在面向对象的编程中我们更注重各个对象之间的逻辑关系。在大型项目中我们首先去思考项目是由哪些对象组成的,再分别创造出所需要的各个对象,最后再组装到一起形成一个完整的项目。
例如:如何造一台电脑
①设计电脑的组成部分
②创造对应零件(对象):操作系统、显卡、内存、硬盘、主板、CPU、电源、机箱等
③组装各部分零件
④亮机测试
宏观上由面向对象把握,微观上还是面向过程进行执行。
2.类的理解与使用
2.1. 通俗理解类
类(英文名 class),是具有相同特性(属性)和行为(方法)的对象(实例)的抽象模板。
举例理解:
类:动物属于一个类,植物属于一个类,人是一个类,篮球球员也是一个类
实例:具体的某个动物就是动物类的实例/对象,具体的某个人就是人类的一个实例/对象
属性:类中所有的变量,都叫做属性。
方法:类中的所有函数,都叫做方法。
类与对象的关系就如模具和铸件的关系,类的实例化的结果就是对象,而对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为(方法)的对象
2.2.定义一个类
比如我们定义一个球员类
class Player:
age = 0
def __init__(self, name):
self.name = name
def run(self):
print(f"{self.name} 正在奔跑")
其中:
Player 是类名
__init__ 是构造函数,用于实例的初始化
self.name 是实例属性,self在类中代指自身的实例
age 是类属性
run 是方法
2.3.类的实例化
定义了类之后,就可以通过下边的写法实例化它,并访问属性,调用方法
class Player:
def __init__(self, name):
self.name = name
def run(self):
print(f"{self.name} 正在奔跑")
li=Player(name="李明")
# 李明正在奔跑
2.4. 方法的调用
实例化成对象后,如果访问实例属性,可以用 对象.属性名 进行访问。
li=Player(name="李明")
print(li.name)
#李明
如果要调用方法,有两种方法
1. 通过 对象.方法名 使用这种方法,在定义方法时 self 就代表对象(dog),调用时无需再传入了
li=Player(name="李明")
li.run()
#李明正在奔跑
2. 通过 类.方法名 使用这种方法,self 参数要传入实例对象
li=Player(name="李明")
Player.run(li)
#李明正在奔跑
3.静态方法与类方法
3.1. 写法上的差异
类的方法可以分为:
3.1.1. 静态方法:有 staticmethod 装饰的函数
3.1.2. 类方法:有 classmethod 装饰的函数
3.1.3. 实例方法:没有任何装饰器的普通函数
class Player:
def __init__(self, name):
self.name = name
def run(self):
print(f"{self.name}正在奔跑")
@staticmethod
def dribble():
print("正在带球")
@classmethod
def shoot(cls, name):
print(f"{name}出手投篮")
以上代码中, run是普通的实例方法, dribble是静态方法, shoot是类方法
这三种方法,在写法有很大的区别:
1、普通的实例方法,在定义时,他的第一个方法固定是 self,如果是从实例调用,那么 self 参数 不需要传入,如果是通过类调用,那么 self 要传入已经实例化的对象。
2、静态方法,在定义时,不需要 self 参数。
3、类方法,在定义时,第一个参数固定是 cls,为 class 的简写,代表类本身。不管是通过实例还 是类调用类方法,都不需要传入 cls 的参数。
3.2. 方法与函数区别
在 Python 3.x 中,
1. 普通函数(未定位在类里)和静态方法,都是函数( function )。
2. 实例方法(@staticmethod)和类方法,都是方法( method )。
这些结论其实都可以使用 type 函数得到验证。
print(type(li.run))
print(type(li.dribble))
print(type(li.shoot))
#method
#function
#method
方法是一种和对象(实例或者类)绑定后的特殊函数。 方法本质上还是函数,不同之处在于它与对象进行绑定。
4.私有变量与私有方法
Python并没有真正的私有化支持,但可用下划线得到伪私有。
私有变量:以双下划线前导的变量,可以使用 实例._类名_变量名 进行访问
私有方法:以双下划线前导的方法,可以使用 实例._类名_方法名()进行访问
print(dir(li))
'''
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'dribble', 'height', 'name', 'run', 'shoot', 'weight']
'''
5.类的封装
封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现, 外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现。
要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法 直接调用。
私有变量和私有方法,虽然有办法访问,但是仍然不建议使用上面给出的方法直接访问,而应该接 口统一的接口(函数入口)来对私有变量进行查看、变量,对私有方法进行调用。这就是封装。 正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。 使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信 息,在一定程度上保证了系统安全性。
类通过将函数和变量封装在内部,实现了比函数更高一级的 封装。
class Player:
def __init__(self, name):
self.name = name
self.__age = 22
self.height = 208
self.weight = 196
def run(self):
print(f"{self.name}正在奔跑")
@staticmethod
def dribble():
print("正在带球")
@classmethod
def shoot(cls, name):
print(f"{name}出手投篮")
def is_adult(self):
return self.__age >= 18
li=Player(name='黎明')
print(li.is_adult())
#True