面向对象 进阶

classmethod:类方法

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

​ 对象的绑定方法特点
​ 由对象调用,会将对象当作第一个参数传给该方法
​ 类的绑定方法的特点
​ 由类来调用,会将类当作第一个参数传给该方法

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

    @classmethod  # 此处加上装饰器
    def tell_info(cls):
        print(cls)
        print('此处是类方法')


p = People('tank',18)
p.tell_info()  # 加了装饰器不影响对象调用
People.tell_info()  # 让类(省去参数)调用

staticmethod:非绑定方法

staticmethod是一个装饰器,可以装饰给类内部的方法,使该方法即不绑定给对象,也不绑定给类。
user = 'allen'
pwd = '111'
import settings
import hashlib
import uuid

class Teacher:
    def __init__(self, user, pwd):
        self.user = user
        self.pwd = pwd

    def index(self):
        if self.user == 'allen' and self.pwd == '111':
            print('验证通过,显示主页...')

    @classmethod
    def login_auth_from_settings(cls):
        obj = cls(settings.user, settings.pwd)
        return obj

    @staticmethod
    def create_id():
        uuid_obj = uuid.uuid4()
        md5 = hashlib.md5()
        md5.update(str(uuid_obj).encode('utf8'))
        return md5.hexdigest()


print(Teacher.create_id())
t1 = Teacher('allen', '111')
print(t1.create_id())

UUID 加密模块

​ 通过时间戳生成唯一的随机随机字符串

isinstance:

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

应用:判断一个对象是否是一个类的实例

issubclass:

​ python内置的函数,可以传入两个参数,用于判断参数一是否是参数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

反射:

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

​ - 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('allen', 22, 'male')

print('name' in p.__dict__)  #  True  这是用普通方法判断
print(hasattr(p, 'name'))  # True  这是用hasattr方法判断

print(p.__dict__.get('name'))  # allen  这是用普通方法获取
print(getattr(p, 'name', 'jason'))  # allen  这是用getattr方法获取,取到
print(getattr(p, 'name2', 'jason'))  # jason  这是用getattr方法获取,没取到,用jason

p.level = 10  # 这是用普通方法添加属性
print(p.level)  # 10
setattr(p, 'salary', '20')  # 这是用setattr方法添加属性
print(p.salary)  # 20

del p.level  # 普通方法删除
print(hasattr(p, 'level'))  # False
delattr(p, 'salary')  # 这是用delattr方法删除
print(hasattr(p, 'salary'))  # False

魔法方法:

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

​ 魔法方法会在对应的特定条件成立时触发

__ init __:在调用类时触发
__ str __: 在打印对象时触发,必须要有一个返回值,类型必须是字符串
__ del __: 在程序执行结束时触发,销毁对象。该方法在最后执行。
__ getattr __  在“对象调用属性时,属性没有”的情况下触发。默认返回none,若想打印属性的结果,必须return一个值
__ setattr __  在“对象.属性 = 属性值”时触发。只触发,不修改(添加)类的属性。
__ call __  在对象被调用时被触发
__ new __  在__init__执行前触发

单例模式

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

​ 实例化多个对象会产生不同的内存地址,单例可以让所有调用者,在调用类产生同一个对象时,都指向同一个对象的地址。例如:打开文件

目的:减少内存占用。
方式一:classmethod
	__instance = None  # 定义一个变量接收一个对象

    @classmethod
    def singleton(cls, file_name): 
        if not cls.__instance:  # 判断是否已经存在一个对象
            obj = cls(file_name)  # 不存在就实例化一个
            cls.__instance = obj  # 传给__instance
        return cls.__instance  # 返回一个对象

方式二:

    __instance = None
    
    def __new__(cls, *args, **kwargs):
        # cls.__new__(cls, *args, **kwargs)
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance
posted @ 2019-10-12 18:54  AllenCH  阅读(99)  评论(0编辑  收藏  举报