day33

classmethod

classmethod是一个装饰器,可以装饰给类内部的方法,使该方法绑定给类来使用

-对象的绑定方法特殊之处

由对象来调用,会将对象当做第一个参数传给该方法。

-类的绑定方法特殊之处

由类来调用,会将类当做第一个参数传给该方法

staticmethod

staticmethod是一个装饰器,可以装饰给类内部的方法,使该方法即不绑定给对象,也不绑定给类

面向对象高级

__class__

对象的属性,获取该对象当前的类

isinstance(参数1,参数2):

python内置的函数,可以传入两个参数,用于判断参数1是否是参数2的一个实例

即 判断一个对象是否是一个类的实例。

issubclass(参数1,参数2):

用与判断参数1是否是参数2的子类。

即 判断一个类是否是另一个类的子类

案例

class Foo:
    pass

class Goo(Foo):
    pass


foo_obj = Foo()
print(isinstance(foo_obj, Foo)) # True
print(isinstance(foo_obj, Goo))  # False
print(issubclass(Goo, Foo))  # True

反射

指的是通过"字符串",对 对象或类的属性进行操作

class People:
    country = 'China'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

hasattr:

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

# 普通方式
p = People('tank', 17, 'male')
print('name' in p.__dict__)  # True
print('country' in People.__dict__)  # True
print('country2' in People.__dict__)  # False
# hasattr
print(hasattr(p, 'name'))  # True
print(hasattr(People, 'country'))  # True

getattr:

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

# 普通方式
p = People('tank', 17, 'male')
print(p.__dict__.get('name'))  # tank
print(p.__dict__.get('level', '9'))  # 9

# getattr
print(getattr(p, 'name', 'jason_sb'))  # tank
print(getattr(p, 'name1', 'jason_sb'))  # jason_sb
print(getattr(People, 'country2', 'China'))

setattr:

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

# 普通
p.level = 10
print(p.level)  # 10

# 反射
setattr(p, 'sal', '3.0')
print(hasattr(p, 'sal'))  # True

delattr:

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

# 普通
del p.level
print(hasattr(p, 'level'))  # False

# 反射
delattr(p, 'sal')
print(hasattr(p, 'sal'))  # False

魔法方法

凡是在类内部定义,以__开头__结尾的方法都称之为魔法方法,又称为“类的内置方法”

魔法方法会在某些条件成立时触发。

__init__

在调用类时触发

__str__

会在打印对象时触发

__del__

对象被销毁前执行该方法,该方法会在最后执行

__getattr__

会在 对象 . 属性 时,“属性没有”的情况下触发

__setattr__

会在“对象.属性 = 属性值”时触发

__call__

会在对象被调用时触发

__new__

会在__init__执行前触发

案例

class Foo(object):

    def __new__(cls, *args, **kwargs):
        print(cls)
        return object.__new__(cls)  # 真正产生一个空对象

    # 若当前类的__new__没有return一个空对象时,则不会触发。
    def __init__(self):
        print('在调用类时触发...')

    # def __str__(self):
    #     print('会在打印对象时触发...')
    #     # 必须要有一个返回值, 该返回值必须时字符串类型
    #     return '[1, 2, 3]'

    def __del__(self):
        print('对象被销毁前执行该方法...')

    def __getattr__(self, item):
        print('会在对象.属性时,“属性没有”的情况下才会触发...')
        print(item)
        # 默认返回None, 若想打印属性的结果,必须return一个值
        return 111

    # 注意: 执行该方法时,外部“对象.属性=属性值”时无效。
    def __setattr__(self, key, value):
        print('会在 “对象.属性 = 属性值” 时触发...')
        print(key, value)
        print(type(self))
        print(self, 111)
        self.__dict__[key] = value

    def __call__(self, *args, **kwargs):
        print(self)
        print('调用对象时触发该方法...')

foo_obj = Foo()
print(foo_obj)
print(foo_obj.x)
print(foo_obj.x)
foo_obj.x = 123
print(foo_obj.x)
foo_obj()
list1 = [1, 2, 3]  # list1 = list([1, 2, 3])
print(list1)  # [1, 2, 3]

单例模式

单例模式指的是单个实例,实例指的的是调用类产生的对象

实例化多个对象会产生不同的内存地址,单例可以让所有调用者

在调用类产生对象的情况下都指向同一份内存地址。

单例的目的

为了减少内存的占用

posted @ 2019-10-12 21:27  Isayama  阅读(126)  评论(0编辑  收藏  举报