zoukankan      html  css  js  c++  java
  • python-面向对象中的特殊方法 ,反射,与单例模式

    二,面相对象的特殊成员及相关内置函数

    2.1 isinstance与issubclass

    isinstance(obj,cls)检查是否obj是否是类 cls 的对象

    1 class A: pass
    2 
    3 class B(A): pass
    4 
    5 abj = B()
    6 print(isinstance(abj,B))  #True
    7 print(isinstance(abj,A))  #True
    8 
    9 示例
    示例

    issubclass(sub, super)检查sub类是否是 super 类的派生类

    1 class A: pass
    2 
    3 class B(A): pass
    4 
    5 abj = B()
    6 
    7 print(issubclass(B,A)) #True
    8 
    9 示例
    示例

    2.2 反射

    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

    四个可以实现自省的函数

    下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

     1 class Foo:
     2     f = '类的静态变量'
     3     def __init__(self,name,age):
     4         self.name=name
     5         self.age=age
     6 
     7     def say_hi(self):
     8         print('hi,%s'%self.name)
     9 
    10 obj=Foo('egon',73)
    11 
    12 #检测是否含有某属性
    13 print(hasattr(obj,'name'))
    14 print(hasattr(obj,'say_hi'))
    15 
    16 #获取属性
    17 n=getattr(obj,'name')
    18 print(n)
    19 func=getattr(obj,'say_hi')
    20 func()
    21 
    22 print(getattr(obj,'aaaaaaaa','不存在啊')) #报错
    23 
    24 #设置属性
    25 setattr(obj,'sb',True)
    26 setattr(obj,'show_name',lambda self:self.name+'sb')
    27 print(obj.__dict__)
    28 print(obj.show_name(obj))
    29 
    30 #删除属性
    31 delattr(obj,'age')
    32 delattr(obj,'show_name')
    33 delattr(obj,'show_name111')#不存在,则报错
    34 
    35 print(obj.__dict__)
    36 
    37 对实例化对象的示例
    对实例化对象的示例
     1 复制代码
     2 class Foo(object):
     3  
     4     staticField = "old boy"
     5  
     6     def __init__(self):
     7         self.name = 'wupeiqi'
     8  
     9     def func(self):
    10         return 'func'
    11  
    12     @staticmethod
    13     def bar():
    14         return 'bar'
    15  
    16 print getattr(Foo, 'staticField')
    17 print getattr(Foo, 'func')
    18 print getattr(Foo, 'bar')
    19 
    20 对类的示例
    对类的示例
     1 import sys
     2 
     3 
     4 def s1():
     5     print 's1'
     6 
     7 
     8 def s2():
     9     print 's2'
    10 
    11 
    12 this_module = sys.modules[__name__]
    13 
    14 hasattr(this_module, 's1')
    15 getattr(this_module, 's2')
    16 
    17 对当前模块的示例
    对当前模块的示例
     1 #一个模块中的代码
     2 def test():
     3     print('from the test')
     4 """
     5 程序目录:
     6     module_test.py
     7     index.py
     8  
     9 当前文件:
    10     index.py
    11 """
    12 # 另一个模块中的代码
    13 import module_test as obj
    14 
    15 #obj.test()
    16 
    17 print(hasattr(obj,'test'))
    18 
    19 getattr(obj,'test')()
    20 
    21 其他模块的示例
    其他模块的示例

    2.3 __len__

     1 class A:
     2     def __init__(self):
     3         self.a = 1
     4         self.b = 2
     5 
     6     def __len__(self):
     7         return len(self.__dict__)
     8 a = A()
     9 print(len(a))
    10 
    11 示例
    示例

    2.4__hash__

    1 class A:
    2     def __init__(self):
    3         self.a = 1
    4         self.b = 2
    5 
    6     def __hash__(self):
    7         return hash(str(self.a)+str(self.b))
    8 a = A()
    9 print(hash(a))
    View Code

     2.5 __str__

    如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

    1 class A:
    2     def __init__(self):
    3         pass
    4     def __str__(self):
    5         return '太白'
    6 a = A()
    7 print(a)
    8 print('%s' % a)
    View Code

     2.6 __repr__

    如果一个类中定义了__repr__方法,那么在repr(对象) 时,默认输出该方法的返回值。

    1 class A:
    2     def __init__(self):
    3         pass
    4     def __repr__(self):
    5         return '太白'
    6 a = A()
    7 print(repr(a))
    8 print('%r'%a)
    View Code

    2.7__call__

    对象后面加括号,触发执行。

    注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

     1 class Foo:
     2 
     3     def __init__(self):
     4         pass
     5     
     6     def __call__(self, *args, **kwargs):
     7 
     8         print('__call__')
     9 
    10 
    11 obj = Foo() # 执行 __init__
    12 obj()       # 执行 __call__
    View Code

    2.8__eq__

     1 class A:
     2     def __init__(self):
     3         self.a = 1
     4         self.b = 2
     5 
     6     def __eq__(self,obj):
     7         if  self.a == obj.a and self.b == obj.b:
     8             return True
     9 a = A()
    10 b = A()
    11 print(a == b)
    View Code

    2.9__del__

    析构方法,当对象在内存中被释放时,自动触发执行。

    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

    2.10__new__ , 单例模式

     1 class A:
     2     def __init__(self):
     3         self.x = 1
     4         print('in init function')
     5     def __new__(cls, *args, **kwargs):
     6         print('in new function')
     7         return object.__new__(A, *args, **kwargs)
     8 
     9 a = A()
    10 print(a.x)
    View Code
    1 class A:
    2     __instance = None
    3     def __new__(cls, *args, **kwargs):
    4         if cls.__instance is None:
    5             obj = object.__new__(cls)
    6             cls.__instance = obj
    7         return cls.__instance
    8 
    9 单例模式
    单例模式

    2.11 item系列

     1 class Foo:
     2     def __init__(self,name):
     3         self.name=name
     4 
     5     def __getitem__(self, item):
     6         print(self.__dict__[item])
     7 
     8     def __setitem__(self, key, value):
     9         self.__dict__[key]=value
    10     def __delitem__(self, key):
    11         print('del obj[key]时,我执行')
    12         self.__dict__.pop(key)
    13     def __delattr__(self, item):
    14         print('del obj.key时,我执行')
    15         self.__dict__.pop(item)
    16 
    17 f1=Foo('sb')
    18 f1['age']=18
    19 f1['age1']=19
    20 del f1.age1
    21 del f1['age']
    22 f1['name']='alex'
    23 print(f1.__dict__)
    View Code
  • 相关阅读:
    WCF之Binding
    Coding获取站点中被任何用户标记为I like it的项
    CSS兼容性
    CSS Hacker
    putty配置
    css中fontfamily的中文字体
    Linux下 zip 和 unzip的用法
    搭建WebService服务 【转】
    【基于spark IM 的二次开发笔记】第一天 各种配置
    在DirectX环境下读入3DS模型并显示
  • 原文地址:https://www.cnblogs.com/liuye1990/p/9272801.html
Copyright © 2011-2022 走看看