面向对象三大特征: 封装 继承 多态
-封装:对类中成员属性和方法的保护,控制外界对内部成员的访问,修改,删除等操作
私有的: private
在本类内部可以访问,类的外部不可以访问.(python中 属性或者方法前面加上两个下划线 ‘__’)
受保护的:protected
允许有继承关系的子类访问(Python开发者约定俗成的,属性或者方法前面加上一个下划线 ‘_’)
公有的: public
在本类的内部和外部都可以访问.
属性 |
含义 |
|
__doc__ |
该函数的文档字符串,没有则为 None;不会被子类继承。 |
可写 |
__name__ |
该函数的名称。 |
可写 |
__qualname__ |
该函数的 qualified name。 3.3 新版功能. |
可写 |
__module__ |
该函数所属模块的名称,没有则为 None。 |
可写 |
__defaults__ |
由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None。 |
可写 |
__code__ |
表示编译后的函数体的代码对象。 |
可写 |
__globals__ |
对存放该函数中全局变量的字典的引用 --- 函数所属模块的全局命名空间。 |
只读 |
__dict__ |
命名空间支持的函数属性。 |
可写 |
__closure__ |
None 或包含该函数可用变量的绑定的单元的元组。有关 cell_contents 属性的详情见下。 |
只读 |
__annotations__ |
包含参数标注的字典。字典的键是参数名,如存在返回标注则为 'return'。 |
可写 |
__kwdefaults__ |
仅包含关键字参数默认值的字典。 |
可写 |
绑定方法:
1.绑定到对象 : 当对象去调用类中成员方法时,系统会默认把该对象当成参数传递给该方法
2.绑定到类 : 当对象或者类去调用类中成员方法时,系统会默认把该类当成参数传递给该方法
使用方式:
对象.成员属性
对象.成员方法
class Car():
# 公有属性
brand = "1"
# 受保护属性
_wheel = 4
# 私有属性
__price = 50000
# 公有方法
def run(self):
print("百公里油耗50L,brand={} , price={}".format(self.brand, self.__price))
# 私有方法
def __info(self):
print("车主信息都想看,想屁吃呢!")
# 实例化对象(类的实例化)
my_car = Car()
my_car.brand = '五菱宏光'
# (1)实例化的对象访问成员属性和方法
# 公有
print(my_car.brand)
# 其中的 __price是在类里面访问的
my_car.run()
# (2)实例化的对象动态添加公有成员属性
my_car.color = "红"
# __dict__ 获取类对象的内部成员
# 通过这个可以查看怎么内部的私有成员/修改私有成员
print(my_car.__dict__)
print(Car.__dict__)
# (3)实例化的对象动态添加公有成员方法
# 1.无参方法
def 喇叭():
print('滴滴滴滴的的叫')
my_car.喇叭 = 喇叭
my_car.喇叭()
# 2.有参方法
# 基本版
def price(num):
print("我的价格为{}".format(num))
my_car.price = price
my_car.price(2100)
# 升级版
def price1(num, obj):
print("{1}现在价格为{0}".format(num, obj.brand))
my_car.price1 = price1
my_car.price1(51000, my_car)
# 究极版
"""如果要创建绑定方法,参数的顺序,self对象本身要放到第一位."""
def price1(obj,num):
print("{}现在价格为{}".format(obj.brand, num))
import types
# 创建绑定方法,系统自动把该对象当成参数传递给方法;
# types.MethodType(方法,对象) => 绑定方法
my_car.price1 = types.MethodType(price1,my_car)
my_car.price1(20000)
# lambda表达式
my_car.引擎 = lambda : print('V12')
my_car.引擎()
-继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法
super调用父类方法
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序
issubclass(class, classinfo)
issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类
参数
class -- 类。
classinfo -- 类。
返回值
如果 class 是 classinfo 的子类返回 True,否则返回 False
class A:
pass
class B(A):
pass
print(issubclass(B,A)) # 返回 True
魔术方法(特定时机自动触发)
#__init__魔术方法(构造方法)
'''
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无
'''
#__new__ 魔术方法
'''
触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
功能:控制对象的创建过程
参数:至少一个cls接受当前的类,其他根据情况决定
返回值:通常返回对象或None
'''
#__del__ 魔术方法(析构方法)
'''
触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无
'''
#__call__ 魔术方法
'''
触发时机:把对象当作函数调用的时候自动触发
功能: 模拟函数化操作
参数: 参数不固定,至少一个self参数
返回值: 看需求
'''
#__str__ 魔术方法
'''
触发时机: 使用print(对象)或者str(对象)的时候触发
功能: 查看对象
参数: 一个self接受当前对象
返回值: 必须返回字符串类型
'''
#__repr__ 魔术方法
'''
触发时机: 使用repr(对象)的时候触发
功能: 查看对象,与魔术方法__str__相似
参数: 一个self接受当前对象
返回值: 必须返回字符串类型
'''
#----普通变量的基本操作,如果应用在对象上,也有相应的魔术方法
#__bool__ 魔术方法
'''
触发时机:使用bool(对象)的时候自动触发
功能:强转对象
参数:一个self接受当前对象
返回值:必须是布尔类型
'''
'''
类似的还有如下等等(了解):
__complex__(self) 被complex强转对象时调用
__int__(self) 被int强转对象时调用
__float__(self) 被float强转对象时调用
...
...
'''
#__add__ 魔术方法 (与之相关的__radd__ 反向加法)
'''
触发时机:使用对象进行运算相加的时候自动触发
功能:对象运算
参数:二个对象参数
返回值:运算后的值
'''
'''
类似的还有如下等等(了解):
__sub__(self, other) 定义减法的行为:-
__mul__(self, other) 定义乘法的行为:
__truediv__(self, other) 定义真除法的行为:/
...
...
'''
#__len__ 魔术方法
'''
触发时机:使用len(对象)的时候自动触发
功能:用于检测对象中或者类中某个内容的个数
参数:一个self接受当前对象
返回值:必须返回整型
'''
'''
类似的还有如下等等(了解):
__iter__(self) 定义迭代容器中的元素的行为
__reversed__(self) 定义当被 reversed() 调用时的行为
__contains__(self, item) 定义当使用成员测试运算符(in 或 not in)时的行为
...
...
'''
-多态:不同的子类对象,调用相同的父类方法,产生不同的执行结果