以前的编程我们把它称为“面向过程的编程”
重点在于:做什么
现在的编程我们把它称为“面向对象的编程”(oop)
重点在于:谁去做
用来描述具有相同属性或者方法的对象的集合
属性:对象的描述形象
方法:对象的行为
类的特性是:封装、继承、多态
封装
在类中对数据的赋值、内部调用对外部用户是透明的
把一些功能的实现细节不对外暴露
继承
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。
为实现代码的重用, 一个类可以派生出子类
继承也允许把一个派生类的对象作为一个基类对象对待。
多态
接口重用
一个接口,多种实现(重写)
具体的某个事物,实实在在的一个例子
实例化:创建一个类的实例
面向对象的优点
迭代更新方便
结构清晰、易于管理
- class ATM():
- #属性
- money = 50000
- country = "China"
- bank = "gonghang"
- #方法
- def get_money(self,money):
- print(f"get money:{money}")
-
- #实例化:创建一个类的实例
- a1 = ATM()
- a2 = ATM()
- print(dir(a1))
- #属性访问
- print(a1.money,a2.country)
- a1.get_money(500)
一般首字母大写(大驼峰式命令)例如:Person,GoodsInfo
python2 ==》经典类,新式类
python3 ==》 新式类
python2显示object的类是新式类,没有就是经典类(python3默认是新式)
- class A:
- pass
- class B():
- pass
- class C(object):
- pass
- class ATM():
- #属性
- money = 50000
- country = "China"
- bank = "gonghang"
- #方法
- def get_money(self,money):
- print(f"get money:{money}")
-
- #实例化:创建一个类的实例
- a1 = ATM()
- a2 = ATM()
- print(dir(a1))
- #属性访问
- print("实例访问".center(20,"*"))
- print(a1.money,a2.country)
- a1.get_money(500)
- print("类访问".center(20,"*"))
- print(ATM.money)
- print("="*30)
- a1.area = "hunan"
- print(a1.area)
- # print(a2.area) #没有,上面只是a1添加了,但是ATM没有添加,所以a2没有,指针可以引用类空间,但是不能改变
- ATM.color = "blue" #ATM 添加了color所以a1和a2都会有
- print(a1.color,a2.color)
-
- #类空间 和 实例空间
- print("类空间".center(30,"*"))
- print(ATM.__dict__)
- print("a1的空间".center(30,"*"))
- print(a1.__dict__)
- print("a2的空间".center(30,"*"))
- print(a2.__dict__)
-
- a1.money = 20000
- print(a1.money,a2.money)
- #实例只能引用类,不能改变类
类创建的时候会生成类空间
实例化对象生成实例空间,不同的实例之间,空间都是独立的
实例查找属性方法的时候,会先在实例空间查找,找不到就去类空间查找
类空间找不到,就去父类空间找
实例空间会有一个父对象指针,通过这个指针实例就可以访问类的属性方法了

__init__方法实例对象的构造方法(初始化方法)
实例化对象的时候自动调用__init__方法
- class ATM():
- #属性
- money = 50000
- country = "China"
- bank = "gonghang"
-
- def __init__(self,area):
- #实例属性
- self.area = area
- #方法
- def get_money(self,money):
- print(f"get money:{money}")
-
- #实例化
- atm1 = ATM("hunan")
- atm2 = ATM("hubei")
- print(atm1.area,atm2.area)
__new__方法创建实例的方法 ,一般情况下不需要重写
__new__是创建实例的方法 __init__是创建好的实例进行初始化的方法
__new__方法必须要传入一个参数(cls),代表当前类 __new__必须返回一个实例对象 __init__的self就表示__new__返回的实例,__init__在对这个实例进行初始化工作 子类没有定义__new__,就会找父类的__new__ 新式类才有__new__ 如果实例化对象和本身class不一致,__init__不会执行 __new__方法属于静态方法 __init__方法属于实例方法
单例模式
无论是实例化多少次,都返回同一个对象实例