python的绑定与非绑定

57 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)