类的内置方法

绑定方法:

装饰器 -相对于函数而言

@classmethod

-:装饰给类内部的方法,给类使用将类当作第一个参数传给方法

--self -->cls

对象,和类都能调用。只是自动传入的参数不同。

-:对象调用,会将对象当作第一个参数传给方法

@staticmethod

-:非绑定方法,不绑定类和对象--》普通函数

高级方法:

--python内置函数

isinstance(参数1,参数2)

-判断一个对象是否是一个类的实列(对象)

-判断参数1是否参数的对象

issubclass(参数1,参数2)

判断参数1是否参数2的子类

反射:

-指的是通过“字符串”对 对象或类的属性进行操作。

hasattr: 通过字符串,判断该字符串是否是对象或类的属性。

getattr: 通过字符串,获取对象或类的属性。

setattr: 通过字符串,设置对象或类的属性

delattr: 通过字符串,删除对象或类的属性

class People:
    country = 'China'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        
p = People('tank',34,'male')
print(hasattr(p,'name'))
print(getattr(p,'age'))
setattr(p,'sal','3.0')
delattr(p,'level')

hasattr(obj,'属性(字符串)')--True,False
getattr(obj,'属性',defult(默认值)) --True.None / defult
setattr(obj,'属性',‘属性的值’)
delattr(obj,'属性') 
class CMD:
    def __init__(self):
        pass
    def input_cmd(self):
        print('请输入命令!')
        while True:
            cmd = input('输入命令方法名:')
            if hasattr(self,cmd):
                method = getattr(self,cmd)
                method()
            else:
                print('error!!')
    def upload(self):
        print('电影开始上传....')
    def download(self):
        print('电影开始下载....')
        
cmd_obj = CMD()
cmd_obj.input_cmd()

注意:getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,并不会影响文件中真实内容

魔法方法:

-python内置方法,会在某些条件成立是自动触发

--再类内部定义,______开头_______结尾

# 内置方法(object)
__init__ : 会在对象调用类自动触发

__str__  : 会再打印对象时触发,必须要有返回值---》字符串类型

__del__  : 会在程序最后结束时触发,将对象销毁
    
__call__ : 对象被调用时触发,对象后面加括号时,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
    
__new__  : 会在__init__执行前触发,生成一个空对象 [普通函数]  
    
__doc__   : 返回类的注释信息 ,print(类名.__doc__)
    
__setattr__ : 对象调用属性时,添加/修改属性会触发它的执行
    
__delattr__ : 删除属性的时候会触发

__getattr__ : 对象调用属性时,没有该属性时触发,没有默认值就返回None

__getattribute__ : 查找属性无论是否存在,都会执行
    
--当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,除非__getattribute__在执行过程中抛出异常AttributeError
__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self),__new__方法返回的值就是一个实例化对象(ps:如果__new__方法返回None,则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法
    
class A:
    pass
class B(A):
    
    def __new__(cls):
        print('__new__方法被执行')
        return super().__new__(cls)
    def __init__(self):
        print('__init__方法被执行')
b = B()

__new__方法被执行   #创建类
__init__方法被执行  #创建对象

小结:__new__和__init__相配合才是python中真正的类构造器。

单列模式:

-单个实例 : 即调用类产生的对象

--实例化多个对象会产生不同的内存地址,

--基于某种方法实例化多次得到实例是同一个

优点:当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例

#方法一:
--利用类的绑定方法的特性
NAME = 'nick'
AGE = 18
class People():

    __instance = None

    def __init__(self,name,age):
        self.name = name
        self.age = age
    @classmethod
    def from_conf(cls):
        if cls.__instance:
            return cls.__instance
        cls.__instance = cls(NAME,AGE)
        return cls.__instance
obj1 = People.from_conf()
obj2 = People.from_conf()

print(obj1)
print(obj2)
print(obj1.__dict__)
print(obj2.__dict__)
#方法二:
--装饰器
NAME = 'nick'
AGE = 18
def deco(cls):
    cls.__instance = cls(NAME,AGE)
    
    def wrapper(*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return cls.__instance
        res = cls(*args,**kwargs)
        return res
@deco
class People():
    def __init__(self,name,age):
        self.name = name
        self.age = age
p1 = People()
p2 = People()
原文地址:https://www.cnblogs.com/shaozheng/p/11662349.html