python的基础视频看完了,现在学习一下python的OOP编程
类
- 类的定义:calss name :
- 类的调用:name()
- 类属性的调用:
- 类方法的调用
- 调用方法时可以把对象传递过去
- 设置属性或者获取属性时尽量用方法获取或者设置(更安全)
__init()__方法
- 作用:初始化对象
__str()__方法
- 作用:直接打印对象时,返回对象的描述信息,所以定义该方法时必须加:return
私有方法
- 直接在方法前面加__
- 私有方法只能在类里面调用
__del()__方法
- 对象销毁时,并且所有引用都结束时,调用
- 或者在程序结束时调用
sys模块
- sys.getrefcount()测量对象引用的个数,得到的结果比实际结果多1
类的继承
- 使用:在派生类定义的时候,在后面加一个括号,写上基类的名字
- 方法重写
- 方法重写时,可以调用基类的方法,格式:基类.方法(self)或者使用super,格式:super().基类方法()
- 类继承以后私有方法(属性)不被继承
- __init()__方法会被继承
- 多继承:子类拥有多个父类,使用:直接在括号里面写上多个父类
- \类.__mro__查看类调用方法的顺序(c3算法)
多态
- 概念: 等到真正调用的时候才真正确定调用的对象是谁
- python多态表现不明显,c或者c++体现明显
- 充分体现了动态型语言的特点
类属性跟实例属性
- 类属性定义:在类里面定义的属性
- python中,一切皆对象,类称为类对象,new出来的类称为实例对象
- 实例对象里面的属性称为实例属性
- 类对象里面的属性称为类属性
- 类对象(属性)只有一个
- 类对象(属性)如果发生变化,实例对象(属性)也随之变化
- 实例对象(属性)互不关联
- 获取类属性,类属性=类名.属性
实例方法,类方法,静态方法
- 类方法定义:在方法前面添加:@classmethod ,self改成cls
- 可以通过类的名字调用类方法,还可以通过这个类创建出来的对象调用这个类方法
- 静态方法定义:在方法前面添加:@staticmethod ,self可以不写
class Game(object):
#类属性
num = 0
#实例方法
def __init__(self):
#实例属性
self.name = "laowang"
#类方法
@classmethod
def add_num(cls):
cls.num = 100
#静态方法
@staticmethod
def print_menu():
print("----------------------")
print(" 穿越火线V11.1")
print(" 1. 开始游戏")
print(" 2. 结束游戏")
print("----------------------")
耦合与解耦
- 理解:联系比较强,比如修改一处代码,另一处也要改,那么这两个地方的耦合就比较强
__new__方法
- 创建对象的方法
- object._new_(cls),实例化对象才能执行init方法
- _new_(cls)完成创建
- _init_(cls)完成初始化
单例模式
- 创建出来的对象始终指向一个内存地址
- 示例代码:
class Dog(object):
__instance=None
# 只实例化一次对象
__init_flag=False
# 创建对象
def __new__(cls,name):
if cls.__instance==None:
cls.__instance=object.__new__(cls)
return cls.__instance
# 如果不是第一次创建对象则返回上次创建的对象
else :
return cls.__instance
def __init__(self,name):
# 只实例化一次对象
if Dog.__init_flag==False:
self.name=name
Dog.__init_flag=True
a=Dog("哮天犬")
b=Dog("小白")
print(id(a))
print(a.name)
print(id(b))
print(b.name)
异常
- 异常处理:try: except (NameError,xxx)
- Exception
- else----没有异常执行
- finally----最后执行
- ctrl+c也是一个异常
- 异常的传递
- raise抛出自定义异常类
- if判断时,空值都是假的,不会执行,例如,“”,{},[],(),None,0
模块
- import与from import的区别
- as起别名
- print(_name_),如果是自己调用,打印main,如果是main模块调用,打印模块名字
- if _name_==‘_main_’
循环遇到的坑
- 可能会出现漏删
- 解决漏删问题,可以找一个列表把要删除的元素保存起来,