持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~
绑定与非绑定
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
ac = Student('ac')
# 类方法可以由类进行调用也可以由对象进行调用
# Student.count()
# ac.count()
print(ac.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")}'
ac = Student('ac')
# 静态方法可以由类进行调用也可以由对象进行调用
print(ac.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))
ac = Father()
# 对象是否由类实例化的
print(isinstance(ac, Father))
print(isinstance(ac, 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(ac)
print(gx)
2、析构方法
__del__当检测到对象没有被继续引用时 ,就会自动的将对象所占用的内存空间进行清除
class A:
def __init__(self , name , age):
self.name = name
self.age = age
def __del__(self):
print(f'{self.name}被析构删除')
ac = A('帅气的木大' , 24)
xx = ac
print(ac)
del ac
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)