• 面象对象 高阶篇


    静态方法@staticmethod:不可访问类中的变量与方法,唯一的关联就是通过类名去调用

    class Dog(object):
        def __init__(self,name):
            self.name = name
    
        @staticmethod
        def eat(name):
            print("%s is eating" % name)
    
    d = Dog("alex")
    d.eat("hehe")
    

    类方法@classmethod:只能访问类变量,不能访问实例变量

    class Dog(object):
        name = "我是类变量"
        def __init__(self,name):
            self.name = name
    
        @classmethod
        def eat(self):
            print("%s is eating" % self.name)
    
    d = Dog("alex")
    d.eat()
    

     属性方法@property:把类里面的方法变成属性,其跟普通类没有关系

    class Dog(object):
        name = "我是类变量"
        def __init__(self,name):
            self.name = name
    
        @property
        def eat(self):
            print("%s is eating" % self.name)
    
    d = Dog("alex")
    d.eat
    

     属性方法例子

     1 class Flight(object):
     2     def __init__(self,name):
     3         self.flight = name
     4         self.status = 1
     5 
     6     def checking_status(self):
     7         print("checking flight %s status %s" % (self.flight,self.status))
     8 
     9     @property
    10     def flight_status(self):
    11         if self.status == 0:
    12             print("flight got canceled...")
    13         elif self.status == 1:
    14             print("flight is arrived...")
    15         elif self.status == 2:
    16             print("flight has departured already...")
    17         else:
    18             print("cannot confirm the flight status...,please check later")
    19 
    20     @flight_status.setter     # 修改属性,不添加修改属性无法直接修改
    21     def flight_status(self,status):
    22         self.status = status
    23         print("flight status change %s" % self.status)
    24 
    25     @flight_status.deleter     # 删除属性
    26     def flight_status(self):
    27         del self.status
    28         print("status got remove....")
    29 
    30 f = Flight("CA980")
    31 
    32 f.flight_status
    33 
    34 f.flight_status = 2
    35 
    36 f.checking_status()
    37 
    38 f.flight_status
    39 
    40 del f.flight_status
    41 
    42 # f.flight_status
    View Code

    类中特殊成员方法

    __doc__ : 类的描述信息

    __module__ : 当前操作的对象在哪个模块

    __class__ : 当前操作的对象的类名

    __init__ : 构造方法,通过类创建对象时自动触发执行

    __del__ : 析构方法,当对象在内存中被释放时自动触发执行(解释器进行垃圾回收时自动执行)

    __call__ : 对象后加(),触发执行(由对象后加括号触发的,即:对象() 或者 类()())

     1 class Foo(object):
     2     def __init__(self):
     3         pass
     4 
     5     def __call__(self, *args, **kwargs):
     6         print("__call__")
     7 
     8     def talk(self):
     9         print("talk")
    10 obj = Foo()
    11 print(obj)
    12 obj()
    13 obj.talk()
    __call__

    __dict__ : 查看类或对象中的所有成员

     1 class Province(object):
     2     country = "China"
     3     def __init__(self,name,count):
     4         self.name = name
     5         self.count = count
     6 
     7     def func(self,*args,**kwargs):
     8         print('func')
     9 
    10 print("33[32;1mProvince:33[0m",Province.__dict__)   # 获取类的成员,静态字段、方法
    11 
    12 
    13 obj1 = Province("alex",300)
    14 print("33[32;1mobj1:33[0m",obj1.__dict__)    # 获取obj1对象成员
    __dict__

    __str__ : 类中定义了__str__方法,打印对象时输出__str__的返回值

     1 class Foo(object):
     2     def __str__(self):
     3         return 'alex Li'
     4     def talk(self):
     5         return "talk"
     6 
     7 
     8 class Dog(object):
     9     def talk(self):
    10         return "talk"
    11 
    12 obj = Foo()
    13 print(obj)
    14 
    15 d = Dog()
    16 print(d)
    __str__

    __getitem__、__setitem__、__delitem__ : 索引操作,如字典。分别表示获取、设置、删除

    class Foo(object):
        def __getitem__(self, item):
            print('__getitem__',item)
    
        def __setitem__(self, key, value):
            print('__setitem__',key,value)
    
        def __delitem__(self, key):
            print('__delitem__',key)
    
    obj = Foo()
    
    result = obj['k1']  # 触发__getitem__
    obj['k2'] = 'alex'   # 触发__setitem__
    del obj['k1']   # 触发__delitem__
    

    python 中一切皆对象,类对象是type类的一个实例,创建类特殊方式 :

    type第一个参数:类名
    type第二个参数:当前类的基类
    type第三个参数:类的成员
    创建类的特殊方式

    __new__ : 在__init__之前执行

    __metaclass__ : 用来表示该类由 谁 来实例化创建

     1 class MyType(type):
     2     def __init__(self,*args,**kwargs):  # 构造方法
     3 
     4         print("Mytype __init__")
     5 
     6     def __call__(self, *args, **kwargs):
     7         print("Mytype __call__")
     8         obj = self.__new__(self)
     9         print("obj ",obj)
    10         print(self)
    11         self.__init__(obj,*args, **kwargs)
    12         return obj
    13 
    14     def __new__(cls, *args, **kwargs):
    15         print("Mytype __new__")
    16         return type.__new__(cls, *args, **kwargs)
    17 
    18 
    19 class Foo(object,metaclass=MyType):  # 表示由MyType这个类来实例化Foo类
    20     def __init__(self,name):
    21         self.name = name
    22         print("Foo __init__")
    23 
    24     def __new__(cls, *args, **kwargs):
    25         print("Foo __new__",cls)
    26         return object.__new__(cls)
    27 
    28 f = Foo("Alex")
    29 print("f",f)
    30 print("f.name",f.name)
    __new__\__metaclass__

    类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

    反射

    getattr : getattr(object, name[, default]) -> value

    hastattr : 判断对象中有没有与字符串对应的方法或属性

    setattr : setattr(x, 'y', v)   ==》 "x.y = v''

    delattr : 删除成员变量 delattr(x,y)

     1 class Foo(object):
     2     def __init__(self):
     3         self.name = 'alex'
     4 
     5     def func(self):
     6         return 'func'
     7 
     8 
     9 obj = Foo()
    10 
    11 print(hasattr(obj,'name'))  # 判断obj是否存在name属性或方法
    12 print(getattr(obj,'func'))   # 获取name属性的值、func方法是获取内存地址
    13 
    14 setattr(obj,'age',18)    # 设置obj中的age属性,如果有会对其相应的值进行更改
    15 print(obj.age)
    16 
    17 delattr(obj,'name')    # 删除obj中的name属性
    18 print(hasattr(obj,'name'))
    反射

    动态导入模块

    动态导入模块方法1: __import__ 

    说明:

      1. 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。

      2. __import__(module)相当于import module

    举例说明:

    首先创建一个模块目录lib,然后在目录内创建一个模块为:aa.py

    模块代码为:

    class c(object):
    def __str__(self):
    return 'C language'

    在lib目录平级新建一个测试的模块,使用 __import__ 动态以字符串形式导入lib下的aa模块。

    lib = __import__('lib.aa') # 相当于import lib
    c = lib.aa.c()
    print(c)

    动态导入模块方法2:import importlib

    实例还是上面的lib.aa模块,这里使用importlib进行动态导入(这个方法好理解,也是官方建议使用的)

    import importlib
    aa = importlib.import_module('lib.aa')
    c = aa.c()
    print(c)

    补充知识
    isinstance(obj,cls): 检查obj是否为cls的对象
    issubclass(sub,super): 检查sub是否super类的派生类
     1 class Foo(object):
     2     def __init__(self):
     3         self.name = 'alex'
     4 
     5     def func(self):
     6         return 'func'
     7 
     8 class Bar(Foo):
     9     pass
    10 
    11 obj = Foo()
    12 #
    13 # print(hasattr(obj,'name'))  # 判断obj是否存在name属性或方法
    14 # print(getattr(obj,'func'))   # 获取name属性的值、func方法是获取内存地址
    15 #
    16 # setattr(obj,'age',18)    # 设置obj中的age属性,如果有会对其相应的值进行更改
    17 # print(obj.age)
    18 #
    19 # delattr(obj,'name')    # 删除obj中的name属性
    20 # print(hasattr(obj,'name'))
    21 
    22 print(isinstance(obj,Foo))
    23 print(issubclass(Bar,Foo))
    补充知识
  • 相关阅读:
    因host命令导致无法正常SHUTDOWN的实验
    ORACLE SEQUENCE 介绍
    SQL Server数据库附加失败:错误5120和错误950
    Java中怎样由枚举常量的ordinal值获得枚举常量对象
    后会终无期,且行且珍惜
    Objective-C辛格尔顿
    自己动手写一个编译器Tiny语言解析器实现
    linux于test 订购具体解释
    Linux高性能server规划——处理池和线程池
    《采访中收集程序猿》学习记录8
  • 原文地址:https://www.cnblogs.com/sshcy/p/8177667.html
Copyright © 2020-2023  润新知