classmethod
翻译:一个类方法
classmethod是一个装饰器,可以装饰给类内部的方法,使该方法绑定给类来使用
对象的绑定方法特殊之处
由对象来调用,会将对象当作第一个参数传给该方法
类的绑定方法特殊之处
由类来调用,会将类当作第一个参数传给该方法
staticmethod
staticmethod是一个装饰器,可以装饰给类内部的方法,使该方法既不绑定给对象,也不绑定给类
面向对象高级
-
isinstance
__class__
:对象的属性,获取该对象当前的类 isinstance(参数1,参数2):
python内置的函数,可以传入两个参数,用于判断参数1是否是参数2的一个实例
判断一个对象是否是一个类的实例
-
issubclass
issubclass(参数1,参数2)
python内置函数,可以传入两个参数,用户判断参数1是否是参数2的子类
判断一个类是否是另一个类的子类
反射
指的是通过“字符串”对 对象或者类的属性进行操作。
—hasattr
:通过字符串,判断该字符串是否是对象或类的属性
—getattr
:通过字符串,获取对象或类的属性
—setattr
:通过字符串,设置对象或类的属性
—delattr
:通过字符串,删除对象或类的属性
魔法方法
凡是在类内部定义,以__开头__结尾
的方法都称之为魔法方法,又称“类的内置方法”
魔法方法会在某些条件成立时触发
__init__
:在调用类时触发
__str__
:会在打印对象时触发
__del__
:对象被销毁前执行该方法,该方法会在最后执行
__getattr__
:会在对象.属性时,“属性没有”的情况下才会触发
默认返回None,若想打印属性的结果,必须return一个值
__setattr__
:会在“对象.属性=属性值”时触发
注意:执行该方法时,外部“对象.属性=属性值”时无效
__call__
:会在对象被调用时触发
__new__
:会在__init__
执行前触发
单例模式
面试题
单例模式指的是单个实例,实例指的是调用类产生的对象
实例化多个对象会产生不同的内存地址,单例可以让所有的调用者
在调用产生对象的情况下都指向同一个内存地址。例如:打开文件
单例的目的:
为了减少内存的占用
'''
从配置文件中获取相同的文件名
新建一个文件,随便写入一些内容
文件名xxx.txt
'''
class File:
__instance = None
#单例方式1
@classmethod
def singleton(cls,file_name):
if not cls.__instance:
obj = cls(file_name)
cls.__instance = obj
return cls.__instance
#单例方式2
def __new__(cls,*args,**kwargs):
if not cls.__instance:
cls.__instance=object.__new__(cls)
return cls.__instance
def __init__(self,file_name,mode='r',encoding='utf-8'):
self.file_name=file_name
self.mode = mode
self.encoding = encoding
def open(self):
self.f = open(self.file_name,self.mode,encoding=self.encoding)
def read(self):
res = self.f.read()
print(res)
def close(self):
self.f.close()
#方式1:
# obj1 = File.singleton(xxx.txt)#singleton(cls)
# obj2 = File.singleton(xxx.txt)#singleton(cls)
# obj3 = File.singleton(xxx.txt)#singleton(cls)
obj1 = File(xxx.txt)
obj2 = File(xxx.txt)
obj3 = File(xxx.txt)
print(obj1)
print(obj2)
print(obj3)
# 方式2
obj1 = File(xxx.txt)#singleton(cls)
obj2 = File(xxx.txt)#singleton(cls)
obj3 = File(xxx.txt)#singleton(cls)
print(obj1)
print(obj2)
print(obj3)