1. 面向对象编程:
- 是一类相似功能函数的集合,使你的代码更清晰化,更合理化。
- 面向对象的程序设计的核心是对象
2. 那什么是类? 什么又是对象?
- 类:就是具有相同属性和功能的一类事物
- 对象:就是类的具体表现形式,是一个容器
3. 类的结构及术语
3.1 总结
class A(object):
# 类属性/类变量/静态字段 都是他
price = 698
# 对象的初始化方法/双下滑线下划线方法
def __init__(self):
# 实例属性/实例变量/字段 都是他
self.name = "dbj"
# 类方法,类调用的时候,会自动把当前类传当作第一个参传入
@classmethod
def test1(cls):
pass
# 对象的绑定方法,又叫实例方法,对象调用的时候,会自动把当前对象传当作第一个参传入
def test2(self):
pass
# 普通函数,调用手动传参
@staticmethod
def test3():
pass
3.1 案例一
class People:
country = '中国' # 类变量/静态字段
# 实例化对象时,自动执行,里面的参数,是实例方法共同拥有的
def __init__(self, name, age):
self.name = name # 实例变量/字段
self.age = age
self.hobby = '看美女'
# 实例方法--- 对象调用,自动传参
def x1(self):
pass
# 类方法--- 类调用自动传参
@classmethod
def x2(csl):
pass
# 静态方法(普通函数)--- 普通的函数,需要手动传参
@staticmethod
def x3():
pass
# 调用准则:静态属性由类调用,实例属性,由对象调用
# 实例化对象
obj = People(name='abc', age=18)
# 对象调用实例方法
obj.x1()
# 类调用静态字段
print(People.country)
3.2 案例二
class A:
company_name = '老男孩教育' # 静态变量(静态字段)
__iphone = '1353333xxxx' # 私有静态变量(私有静态字段)
def __init__(self,name,age): #特殊方法
self.name = name #对象属性(字段)
self.__age = age # 私有对象属性(私有字段)
def func1(self): # 普通方法
pass
def __func(self): #私有方法
print(666)
@classmethod # 类方法
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print('类方法')
@staticmethod #静态方法
def static_func():
""" 定义静态方法 ,无默认参数"""
print('静态方法')
@property # 属性
def prop(self):
pass
3.3 类的其他成员
这里的其他成员主要就是类方法:
- 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
实例方法
- 定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
- 调用:只能由实例对象调用。
类方法
- 定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
- 调用:实例对象和类对象都可以调用。
静态方法
- 定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
- 调用:实例对象和类对象都可以调用。
双下方法(后面会讲到)
- 定义:双下方法是特殊方法,他是解释器提供的 由爽下划线加方法名加爽下划线 __方法名__的具有特殊意义的方法,双下方法主要是python源码程序员使用的,
- 我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更有益于我们阅读源码。
- 调用:不同的双下方法有不同的触发方式,就好比盗墓时触发的机关一样,不知不觉就触发了双下方法,例如:__init__
4. self是什么
self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动,将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个对象。
5. 调用准则
- 静态属性由类调用,实例属性,由对象调用,否则需要自己手动传参
6. 面向对象的三大特性
- 封装
- 继承
- 多肽
7. 对象找类的属性准则
- 对象查找属性的顺序:先从对象空间找 ———> 类空间找 ———> 父类空间找 ———->…..
- 类名查找属性的顺序:先从本类空间找 ———-> 父类空间找————> ……..
- 上面的顺序都是单向不可逆,类名不可能找到对象的属性。
8. 面向对象编写准则
- 归纳类似的方法
- 归纳相同的参数,用__init__统一传参
9. 对象赋值,类赋值
对象赋值:不会改变类中的静态字段值,改的仅仅是自己的对象中的值
类赋值:会改变类中静态字段的值