Python面向对象

    xiaoxiao2021-03-25  16

    单例模式


    class Singleton(object): def __new__(cls, *args, **kwargs): # 如果_instance这个属性不在本对象的字典__dict__里面的话 if not '_instance' in cls.__dict__: # 通过父类object生成一个_instance对象,这个对象是Singleton的实例 cls._instance = object.__new__(cls) # 也可以用这个语句,方法相同,调用super父类的对象 cls._instance = super(Singleton,cls).__new__(cls) #返回该实例 return cls._instance

    函数调用, @classmethod, @property


    python 可以使用类名加函数名的方式进行函数调用 # 不过需要传入的是,这个函数的实例化对象 print Program.get_age(program) @classmethod 类似于java中的静态方法,不需要实例对象,直接类名调用 ClassName.get_class_name() @property 将函数变成属性一样来调用 # 例如下面这个函数 def get_method_name(): pass # 不加@property的时候使用实例名+函数名调用 instanceClass.get_method_name() # 添加property属性的时候 @property def get_method_name(): pass # 调用get_method_name方法 # 原来的函数调用方法get_method_name()已经不能够使用了 instanceClass.get_method_name

    判断子类和实例


    # 是否是该Program对象的实例 print isinstance(backProgram, Program) # NewType是否是Program的子类 print issubclass(NewType, Program)

    python的初始化机制


    # python 先调用__new__,在new中的args参数将需要的参数变量传入 # 之后再调用__init__方法,生成新的实例 class BackProgram(Program): def __init__(self, name, age, description, sex): super(BackProgram, self).__init__(name, age, description) self.__sex = sex print '__init__' def __new__(cls, *args, **kwargs): print args print '__new__' return super(BackProgram, cls).__new__(cls)

    魔术方法


    __add__, __eq__, __mul__, __div__, __sub__, __and__, __or__ 等运算符的魔术方法 def __add__(self, other): if isinstance(other, MagicMethod): return other.__age + self.__age else : raise TypeError("This is not MagicMethod's instance") # 在魔术方法中预算是从左往右的,一旦出现不是两个相同类的实例进行计算,会先抛出最左边的一个类的错误 # 但是如果在最左边那个实例没有抛出异常的话,则无法进行运算, 返回错误。没有指定的运算属性 print oneMagicMethod + twoMagicMethods __str__, __repr__, __dir__, 字符串显示,显示属性魔术方法 class Property(object): def __init__(self, name): self.__name = name # print输入字符串 # 该字符串是给用户观看的,内容 # 该方法同时和__repr__定义时,__repr__方法被屏蔽 def __str__(self): return 'Property name ' + self.__name # 显示这个类有多少属性 def __dir__(self): return self.__dict__.keys() # 打印字符串,机器类代码 def __repr__(self): return 'jfskfjsl' if __name__ == '__main__': property = Property('name') print property print property.__dict__ getattribute, getattr, setattr, 这里getattribute和getattr的区别就是:getattr会在没有查找到相应实例属性时被调用, 而getattribute则每次都会调用 # getattr # 获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。 # 需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法, # 可以在后面添加一对括号。 >>> class test(): ... name="xiaohua" ... def run(self): ... return "HelloWord" ... >>> t=test() >>> getattr(t, "name") #获取name属性,存在就打印出来。 'xiaohua' >>> getattr(t, "run") #获取run方法,存在就打印出方法的内存地址。 <bound method test.run of <__main__.test instance at 0x0269C878>> >>> getattr(t, "run")() #获取run方法,后面加括号可以将这个方法运行。 'HelloWord' >>> getattr(t, "age") #获取一个不存在的属性。 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: test instance has no attribute 'age' >>> getattr(t, "age","18") #若属性不存在,返回一个默认值。 '18' >>> # setattr # 给对象的属性赋值,若属性不存在,先创建再赋值。 >>> class test(): ... name="xiaohua" ... def run(self): ... return "HelloWord" ... >>> t=test() >>> hasattr(t, "age") #判断属性是否存在 False >>> setattr(t, "age", "18") #为属相赋值,并没有返回值 >>> hasattr(t, "age") #属性存在了 True >>> __main__函数

    在python中,当一个module作为整体被执行时,moduel.__name__的值将是’__main__’;而当一个 module被其它module引用时,module.__name__将是module自己的名字,当然一个module被其它module引用时,其本身并不需要一个可执行的入口main了。

    >>> import hello >>> hello.__name__ 'hello'
    转载请注明原文地址: https://ju.6miu.com/read-200314.html

    最新回复(0)