Python3 面向对象
类命名使用大驼峰法则
# 创建类语法
# 类中封装的方法,第一个参数必须是 self
# 那一个对象调用的方法,self 就是哪一个对象的引用
class ClassName:
def 函数1(self):
self.成员属性
...
def 函数2(self, param):
...
# 创建对象语法
对象变量 = 类名()
对象初始化
class Cat:
# 初始化方法,类被实例化时自动执行,不需要调用
def __init__(self, new_name):
self.name = new_name
def __del__(self):
print("对象被销毁")
def __str__(self):
return "需要打印出的内容"
def 函数1(self):
...
# 调用类
tom = Cat("Tom") # 这样Tom就自动在__init__中被赋值给name属性
print(tom) # 因为使用了 __str__ 函数定义,所以不会打印出地址信息,打印的是自定义的信息
__del__ 方法
对象被销毁前,会自动调用对象的 __del__ 方法,与初始化 __init__ 方法对应
如果对象被销毁前进行操作,则可以使用此方法
__str__ 方法
把对象地址信息等替换为自定义的信息
此方法必须返回一个字符串
Python身份运算符
python中 None 使用 is 或 is not 身份运算符
私有属性和私有方法
在定义属性或方法时,在属性或方法面前增加2个下划线,定义的就是私有属性或方法了
子类不可访问父类的私有属性方法,但可以通过父类的公有方法间接访问到父类的私有方法和属性
python中没有真正意义上的私有属性和方法,通过:实例化的对象._类名.__私有属性或方法() 就可以调用私有
类的继承有传递性:
class 父类:
...
class 子类1(父类):
...
# 此情况下子类2拥有父类和子类1所有属性和方法
class 子类2(子类1):
...
方法重写:子类中重新定义方法,会覆盖掉当前子类中的父类方法
子类中调用父类方法:super().方法名()
类可以多继承
class A:
def demo1(self):
...
class B:
def demo2(self):
...
class C(A, B):
pass
多继承要避免方法、属性重名
类属性类方法
类属性调用:类名.属性名;不要用对象名来调用
类方法:
class 类名:
count = 7;
def __init__(self):
...
# 类方法定义前要写@classmethod,参数要写cls
@classmethod
def 类方法名(cls):
print(cls.count)
# 类方法调用
类名.类方法名()
静态方法
class 类名:
# 静态方法不使用类方法、属性和实例方法、属性
# 静态方法定义前要写@staticmethod,参数为空
@staticmethod
def 静态方法名():
print("123")
# 静态方法调用
类名.静态方法名()
__new__()方法
__new__()方法作用:1)为对象在内存中分配空间;2)返回对象的引用
__new__方法(第一个执行)先于__init__方法执行
只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下
class Person(object):
def __new__(cls):
instance = super().__new__(cls)
return instance
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;__new__必须要有返回值,返回实例化出来的实例,可以return父类new出来的实例,或直接是object的new出来的实例;否则对象没有分配内存空间无法实例化
单例设计模式
单例:让类创建的对象,在系统中只有唯一的一个实例
1、定义一个类属性,初始值为 None,用于记录单例对象的引用(内存地址)
2、重写 __new__ 方法
3、如果类属性 is None,调用父类方法分配空间,并在类属性中记录结果
4、返回类属性中记录的对象引用
*一个类被多次调用实例化,如果不使用单例,每次都会实例化,占用内存空间,但每个对象都是一样的;所以使用单例模式,把类的实例化封装成一个方法,如果已经被实例化了就直接调用,没有实例化就先进行实例化,这样每次调用都是同一个实例化的类,节省资源
class CreateCls(object):
# 记录第一个被创建对象的引用
instance = None
def __new__(cls, *args, **kwargs):
# 1、判断类属性是否为空对象
if cls.instance is None:
# 2、调用父类的方法,为第一个对象分配空间
instance = super().__new__(cls)
# 返回类属性保存的对象引用
return cls.instance
初始化方法只调用一次
class ClassName(object):
# 记录是否执行过初始化动作
init_flag = False
def __init__(self):
# 1、判断是否执行过初始化动作
if ClassName.init_flag:
# 初始化属性为真,不需要再初始化操作
return
# 2、如果没有执行过,再执行初始化动作
print("初始化操作")
# 3、修改类属性的标记
ClassName.init_flag = True