目录
前言:
1.绑定方法
(1)实例方法
(2)类方法
(3)静态方法
2.类型检测
(1)issubclass() 函数
(2)isinstance() 函数
3.内置方法(魔法方法)
(1)信息格式化(__str__())
(2)析构方法(__del__())
(3)空间分配(__new__())
前言:
前面已经学习了Python中的三大特征:封装、继承、多态。核心内容基本上也说完了,那今天这一期主要是讲讲Python中一些语法方法,包括绑定方法(示例方法,类方法,静态方法)和内置方法,好了废话不多说,上正题。
1.绑定方法
(1)实例方法
前面我们已经讲过了实例方法,也就是在类里面定义方法的时候会带有一个self实例参数,当我们去使用实例方法的时候,实例参数会传入给self进行调用,然后去实现相关功能
class A(object):
def __init__(self,name,age):
self.name=name
self.__age=age
def fun(self): #定义的实例方法
return self.__age
user=A('小敏',18)
print(user.fun())
#输出结果:18
实例方法前面已经讲过了,这里就不多说了
(2)类方法
概念
类方法:顾名思义就是通过类去调用的方法, 用装饰器@classmethod进行装饰,类方法可以类在多次实例化后有个记忆的功能。类方法操作的是类属性,因为类方法无法通过self去查找对象的实例属性
当我们去通过装饰器@classmethod 去装饰一个方法的时候,这个方法就会被定义为类方法,然后会自动带有cls参数,这个参数就是类参数
调用规则:
类方法的调用不一定需要实例化对象才可以调用,可以通过类去直接使用:类.类方法() ,当然也可以去通过实例对象去调用都是没问题的
看个例子:
class B(object):
def __init__(self,name):
self.name=name
@classmethod
def fun(cls):
print('这是一个类方法')
B.fun()
#输出结果:这是一个类方法
user=B('jk')
user.fun()
#输出结果:这是一个类方法
这里我们可以看到,当去调用类方法的时候不需要实例化对象就可以去调用(实例化对象也可以调用)
再看个例子,类方法虽然不可以操作实例属性,但是可以去操作类属性的:
class A(object):
count=0 #定义的类属性
def __init__(self,name):
self.name=name
A.classway() #调用类方法
self.fun()
@classmethod
def classway(cls):
cls.count+=1 #类方法可以去操作类属性,但是不能操作实例属性(self)
#统计次数
def fun(self):
print(f'调用了第{self.count}次')
for i in range(4):
t=A('jb')
#输出结果:
# 调用了第1次
# 调用了第2次
# 调用了第3次
# 调用了第4次
注意:
类无法调用实例方法
实例对象可以调用类方法
区别在于:类方法不用实例化对象,只用类就可以调用
总的来说就是实例对象既可以调用实例方法/实例属性,也可以调用类方法/属性;而类对象只能调用类方法/类属性,不能调用实例方法/属性
(3)静态方法
概念:
静态方法:通过装饰器@staticmethod进行修饰,没有cls,self参数,没有任何绑定
性质和作用
静态方法就是相当于定义在类外面的函数,只是为了方便管理常用的方法(函数),放在类中,统一管理
静态方法 不访问类成员(类方法,类属性),实例成员(实例属性,实例方法)
用于:定义常用的工具函数
class Student(object):
def __init__(self,name,age):
self.name=name
self.age=age
def fun(self):
print('学生')
def study():
print('学习知识')
dick=Student('dick',18)
dick.study=study
dick.study()
#输出:学习知识
通过上面这个示例,我们很容易看出study() 这个方法是在外部添加给实例对象dick,其实这就是静态方法的实质,区别不同的是静态方法是放到类对象的内部的。
示例:静态方法的定义
import time
class Student(object):
def __init__(self,name,age):
self.name=name
self.age=age
def fun(self):
print('学生')
@staticmethod
def study():
print(time.asctime(time.localtime()),'dk刷了一道题')
dick=Student('dick',18)
dick.study()
#输出:Sat Mar 4 20:22:01 2023 dk刷了一道题
Student.study()
#输出:Sat Mar 4 20:22:26 2023 dk刷了一道题
注意:
静态方法是不绑定类对象(cls)和实例对象(self)的,所以既可以通过实例对象去调用,也可以通过类对象去调用
2.类型检测
在此之前我们学过了以类型检测的方法type() 函数,这个函数可以检测变量类型的
a=15
b=False
print(type(a),type(b))
#输出结果:<class 'int'> <class 'bool'>
(1)issubclass() 函数
语法格式:issubclass(son,dad……)
参数说明:son 是表示子类,dad是表示父类,父类可以是多个(多继承)
作用:这个函数可以检测子类(son)与父类(dad)是否有继承关系,返回布尔变量(True,False)
class A(object):
pass
class B(A):
pass
print(issubclass(B,A))
#输出结果:True
(2)isinstance() 函数
语法格式:isinstance(obj, cls)
参数说明:obj 是表示实例化对象,cls是表示类对象,
作用:判断一个实例化对象是不是由某一个类对象而来的
class A(object):
pass
a=A()
print(isinstance(a,A))
#输出结果:True
3.内置方法(魔法方法)
我们可以去通过dir() 直接查找一个类具有的方法,所以我们直接dir(object)去查看类中的内置方法
print(dir(object))
# ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
# '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
# '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
(1)信息格式化(__str__())
在一般情况下,我们输出一个实例对象,结果是这个对象的地址,其实这个是一个类对象对实例对象默认的描述,但是我们也可以去通过类中的内置方法去修改实例对象的描述
方法:
__str__()
该方法用户可以直接通过打印对象名字来获取对象的自定义描述,而不是对应的内存地址
__repr__()
该方法是返回对象的自定义描述,是在交互模式下进行使用返回值:字符串(只能是字符串)
对比两个示例:
class A(object):
def __init__(self,name):
self.name=name
a=A('dick')
print(a)
#输出结果:<__main__.A object at 0x00000224910E17C0>
class A(object):
def __init__(self,name):
self.name=name
def __str__(self):
return '我是dick'
a=A('dick')
print(a)
#输出结果:我是dick
注意:如果__str__()与__repr__() 同时出现的时候,类的描述返回值是选择执行__str__()的,因为__repr__()一般是在交互模式下所以的,脚本模式优先使用__str__()方法
class A(object):
def __init__(self,name):
self.name=name
def __str__(self):
return 'str方法'
def __repr__(self):
return 'repe方法'
a=A('dick')
print(a)
#输出结果:str方法
(2)析构方法(__del__())
__del__()
当检测到对象要被删掉时,就会触发它 ,然后执行这个方法的内容(比如说玩王者荣耀时,英雄阵亡时会触发阵亡语句)
示例:
class Daji(object):
def __init__(self):
self.name='妲己'
def __del__(self): #检测实例对象是否被删除
print('被玩坏了') #如果实例对象被删除了,就执行
hero=Daji()
del hero
# 输出结果:被玩坏了
(3)空间分配(__new__())
当我们去创建一个新的对象的时候,要对这个对象进行空间分配,前面我们讲过object类是所有类中的父类(众神之父),都继承与object类,其中object类是有一个__new__() 方法的,当我们给类对象分配空间的时候会触发__new__()方法,然后得到一个实例化的引索值(实例对象),最后通过__init__() 方法对这个引索值初始化,所有当我们去创建一个实例的时候会执行__new__() 和__init__()方法
所有类都是继承object类,当我们对一个新的类进行def 方法写入,其实都是重写object类
__new__
(cls)作用:内置的静态类方法,主要是给实例对象分配内存空间
例子:
class A(object):#继承object类
def __new__(cls, *args, **kwargs): #重写new方法
print('new function')
res=object.__new__(cls)
return res #返回分配好对象的空间
def __init__(self,name): #会把new方法返回的对象传入到self,然后初始化
print('初始化方法')
self.name=name
a=A('dick')
print(a.name)
#输出结果:
# new function
# 初始化方法
# dick
好了,这一期就先到这里了,我们下一期再见~~~
下一期会进一步详细讲解new方法和init方法
分享一张壁纸: