写在最前
完成一个工作[或一个任务],会有不同的角色;而这个角色为了达成最终目的,会用到不同的方法和属性(空间) 把这个角色需要使用的方法和属性集中在一起展示出来,就形成了我们所说的类 任何一个人成为(类的实例化)这个角色,就都会拥有这个类(既定的方法和属性)。
示例说明(以老师为例):
老师 需要 备课,讲课,辅导学生
把这里的老师比做类,那么老师要教学生,就需要备课,讲课,辅导学生完成作业。备课,讲课,辅导学生就是老师的方法。
教科书就是一个属性,不同的老师可能还会有不同的教课器材,比如:物理老师有地球仪,化学老师还会有实验器材。教科书、地球仪、化学实验器材 这些就是属性
所有的老师都具备 备课,讲课,辅导学生 的能力,这就是老师这个类中的公共方法,所有的老师都有教科书,这个教科书就是公共属性
而物理老师的地球仪,化学老师的化学实验器材,这就是物理老师和化学老师各自独有的私有属性。
面向对象编程
1). 什么是面向对象编程?
使用类 + 对象 代替 函数 的形式
2). 什么是类,什么是对象,之间有什么关系
class aaa:
pass
dd = aaa()
aaa //类
aaa() //类对象
dd //实例对象
类: 属性[变量] 和 函数[方法] 的集合
对象: 类的实例
1). 实例化即调用
2). 类名首字母大写【命名规范】
3). 在类的继承中,py2 和 py3的区别:[横向]广度查找,[纵向]深度查找
4). 面向对象,代码可改造性强
5). 不同角色,用不同的视角
内置方法【部分】
类的描述信息
__doc__
当前操作的对象在哪个模块
__module__
当前类的所有父类(所有父类组成的元组)
__bases__
构造(方法)函数
__init__
析构方法
__del__( self )
类属性
注意:通常你需要在单独的文件中定义一个类
属性: 公有属性、私有属性
方法: 公有方法、私有方法
类的私有属性
class Fa:
def __init__(self):
self.__age = 123
print(Fa.__age)
d = Fa() # 123
print(Fa.__age) # AttributeError: type object 'Fa' has no attribute '__age'
两个下划线开头,声明该属性为私有,不能在类外部被使用或直接访问。在类内部的方法中使用时
self.__private_attrs
类的公有属性、静态属性
class Fa:
age = 123 # 静态属性
def __init__(self):
self.age = 333 # 公有属性
print(self.age)
print(Fa.age)
# age 查找顺序: self.age --> Fa.age
公有属性: 在实例对象的内存区域
静态属性: 在类所在的内存区域
1). 在类代码区内,静态属性只能由类名访问
2). self 可以访问公有属性,也可以访问静态属性
3). 在公有属性和私有属性同名的情况下,self 访问顺序同 函数 内外的局部与全局变量访问方式:先函数内查找,函数内[公有属性(self)]没有再找全局[静态属性(类名)]
4). 公有属性 如果与 静态属性 同名。两个变量在不同的内存地址,不可混淆。
5). 如果两者在代码区内的任何地方被更改,后续代码都得到更改后的值。
class Fa:
age = 123
def __init__(self):
self.age = 333
print(self.age) # 333
print(Fa.age) # 123
Fa.age += 1
self.age -=1
def run(self):
print(self.age) # 332
print(Fa.age) # 124
d = Fa()
d.run()
类方法
在类的内部,使用 def 关键字可以为类定义一个方法
与一般函数定义不同,类方法必须包含参数 self ,且为第一个参数
但在调用时不必传入相应的参数,系统将默认接收为实例对象
类的私有方法
class Fa:
def __init__(self):
print('Fa -- init')
def run(self):
print('Fa -- run')
def show_check(self):
self.__check()
def __check(self):
print('Fa__check')
d = Fa() # Fa -- init
d.ab() # Fa -- run
d.show_check() # Fa__check
d.__ab() # AttributeError: 'Fa' object has no attribute '__ab'
两个 下划线 开头,声明该方法为 私有方法,不能在类外部调用