python 第十八章 内置方法、绑定方法

196 阅读3分钟

大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习python,写的可能不是很好,希望大家多多包涵。 每个赞都是我前进的动力

二,绑定与非绑定

类方法 classmethod

类方法,通过装饰器@classmethod 进行修饰,类方法可以类在多次实例化后有个记忆的功能

类方法操作的一定是类属性,因为类方法无法通过self去查找对象的实例属性

class Bar:
    # 类属性
    id = 0

    def __init__(self, name):
        self.name = name
        self.count()

    @classmethod
    def count(cls):
        cls.id +=1
        return cls.id

af = Bar('python')
print(af.id)

# 类方法可以类调用,也可以对象调用
Bar.count()
af.count()

java = Bar('java')
print(java.id)

go = Bar('go')
print(go.id)

静态方法 staticmethod

  • 静态方法, 通过装饰器进行修饰,没有cls,self参数限制的方法也就是没有绑定的方法
  • 静态方法就是相当于定义在类外面的函数,只是为了方便管理常用的方法(函数)放在类中统一管理
  • 使用@staticmethod修饰的方法 不需要传参
  • 静态方法 不访问类成员和实例成员
  • 用于:定义常用的工具函数
# 静态方法
import time
class A:
    @staticmethod
    def fun1():
        print(f'{time.strftime("%Y/%m/%d")}')

class B(A):
    pass

b = B()
b.fun1()
A.fun1()

三,类型检查

type() # 检查变量的数据类型
issubclass(cls, class_tuple) # 检查是否被继承  返回bool值,判断是否继承
# cls 类名, class_tuple 继承的类名
isinstance(obj, cls) # 对象是否有类实例化而来
# obj 对象   cls 类名

四,内置方法(了解)

1. 信息格式化方法

__str__ 该方法用户可以直接通过打印对象名字来获取对象的自定义描述,而不是对应的内存地址

__repr__该方法是返回对象的自定义描述,是在交互模式下进行使用


## repr
>>> class A:
...     def __repr__(self):
...             return '你们是python最亮的仔'
...
>>>
>>> a = A()
>>> a
你们是python最亮的仔
>>> class B:
...     pass
...
>>>
>>> b = B()
>>> b
<__main__.B object at 0x000001EEB3B61988>

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f'---repr---'

    def __str__(self):
        return f'我叫{self.name} 今年{self.age}岁'



wx = People('wx', 18)
print(wx)

2. 析构方法

__del__ 当检测到对象要被干掉的时候,就会自动的触发这个方法

####   析构方法

class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __del__(self):
        print(f"{self.name}被干掉")

a = A('jk', 12)
del a  # del 把a 干掉
print(A)
print(a)

3. new 方法

__new__ 内置的静态类方法,主要是给实例对象分配内存空间的

python解释器在得到这个方法返回的实例对象引用之后,将这个引用作为第一个参数传递给init方法中使用

如果没有返回这个对象的引用,python解释器就获取不到这个对象,new必须要有返回值

####  new方法
class A:
    def __new__(cls, *args, **kwargs):
        print('给对象分配内存空间')
        instace = super().__new__(cls)
        # 返回这个实例对象
        return instace


    def __init__(self, name, age):
        print('进行初始化方法')
        self.name = name
        self.age = age

a = A('jk', 12)
print(A)
print(a)


单例

好处:省内存,

####  new方法
class A:
    _instance = None
    def __new__(cls, *args, **kwargs):
        print('给对象分配内存空间')
        if cls._instance is None:
            cls._instance = super().__new__(cls, *args, **kwargs)
            # 返回这个实例对象
        return cls._instance


    def __init__(self, name, age):
        print('进行初始化方法')
        self.name = name
        self.age = age



a = A('jk', 12)
b = A('jk', 12)
c = A('jk', 12)
d = A('jk', 12)
e = A('jk', 12)


print(c == b) # True  是单例
print(id(c))
print(id(b))
print(id(d))
print(id(e))