内置方法、绑定方法
一、绑定与非绑定
1、类方法
类方法,通过装饰器@classmethod 进行修饰 , 类方法可以让类在多次实例化中有一个记忆的功能。
类方法操作的一定是类属性 , 因为类方法无法通过self去查找对象绑定的实例属性。
class Student:
# 类属性
id = 0
# 实例属性
def __init__(self , name):
self.name = name
self.count()
@classmethod
def count(cls):
# 这个是类方法
cls.id += 1
return cls.id
cx = Student('cx')
# 类方法可以由类进行调用也可以由对象进行调用
# Student.count()
# cx.count()
print(cx.id)
hzx = Student('hzx')
print(hzx.id)
ll = Student('卢本伟')
ls = Student('吴彦祖')
print(Student.id)
2、静态方法(非绑定)
静态方法,通过装饰器@staticmethod进行装饰;没有cls和self参数限制的方法也就是没有被绑定的方法称之为静态方法。
静态方法就相当于定义在类外面的函数,只是为了方便管理把常用的方法(函数)放在类中统一管理
import time
class Student:
# 类属性
id = 0
# 实例属性
def __init__(self , name):
self.name = name
self.count()
@staticmethod
def str_time():
return f'{time.strftime("%Y/%m/%d")}'
xc = Student('xc')
# 静态方法可以由类进行调用也可以由对象进行调用
print(xc.str_time())
print(Student.str_time())
二、检查类型
type() # 检查单个的数据类型
issubclass(cls , class_tuple) # 检查是否被继承
isinstance(obj , cls) # 对象是否由类实例化的
class Father:
pass
class Son(Father):
pass
# 检查是否有继承关系(前者是否有继承后者)
print(issubclass(Father, Son))
print(issubclass(Father, object))
print(issubclass(Son , Father))
cx = Father()
# 对象是否由类实例化的
print(isinstance(cx, Father))
print(isinstance(cx, Son))
三、内置方法(了解)
1、信息格式化方法
__str__
该方法用户可以直接通过打印对象名来获取该对象的自定义描述,而不是对应的内存地址。
__repr__
该方法时返回该对象的自定义描述,是在交互模式中进行使用
>>> class A:
def __init__(self , name , age):
self.name = name
self.age = age
def __repr__(self):
return f'我叫{self.name},今年{self.age}岁 ,我是最帅气的'
>>> xy = A('帅气的溪岳' , 20)
>>> xy
我叫帅气的溪岳,今年20岁 ,我是最帅气的
>>> ll = A('わかだ' , 21)
>>> ll
我叫わかだ,今年21岁 ,我是最帅气的
>>> mr = A('墨尔本阴',18)
>>> mr
我叫墨尔本阴,今年18岁 ,我是最帅气的
>>> xt = A('勇士刑天' , 23)
>>> xt
我叫勇士刑天,今年23岁 ,我是最帅气的
class A:
def __init__(self , name , age):
self.name = name
self.age = age
# 如果只改写了repr的方法 , 那么str也会对其进行指向输出
# def __str__(self):
# return f'我叫{self.name},今年{self.age}岁'
# 该方法要在交互模式中
def __repr__(self):
return f'我叫{self.name},今年{self.age}岁 ,我是最帅气的'
ac = A('帅气的初雪' , 24)
gx = A('帅气的陈冠希' , 18)
print(cx)
print(gx)
2、析构方法
__del__
当检测到对象没有被继续引用时 ,就会自动的将对象所占用的内存空间进行清除
class A:
def __init__(self , name , age):
self.name = name
self.age = age
def __del__(self):
print(f'{self.name}被析构删除')
cx = A('帅气的初雪' , 24)
xx = cx
print(cx)
del cx
print('='*10)
# gx = A('帅气的陈冠希' , 18)
# # print(ac.name)
# print(gx)
__new__
时内置的静态类方法 , 主要是给实例对象分配内存空间
python解释器在得到这个方法返回的实例对象引用之后 , 将这个引用作为第一个参数传递给__init__
中使用
如果没有返回的化 , python解释器就获取不到这个对象引用 。new必须要有返回值
class B:
def __new__(cls, *args, **kwargs):
print('给对象分配内存空间')
# 给实例对象分配内存空间
instance = super().__new__(cls)
# 返回已经分配好内存空间的对象引用
return instance
def __init__(self):
print('实例对象属性')
x = B()
print(x)