Python面向对象

单例模式


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, 这里getattributegetattr的区别就是:getattr会在没有查找到相应实例属性时被调用, 而getattribute则每次都会调用
# getattr
# 获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
# 需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
# 可以在后面添加一对括号。
>>> class test():
...     name="xiaohua"
...     def run(self):
...             return "HelloWord"
...
>>> t=test()
>>> getattr(t, "name") #获取name属性,存在就打印出来。
'xiaohua'

>>> getattr(t, "run")  #获取run方法,存在就打印出方法的内存地址。
0x0269C878>>

>>> getattr(t, "run")()  #获取run方法,后面加括号可以将这个方法运行。
'HelloWord'

>>> getattr(t, "age")  #获取一个不存在的属性。
Traceback (most recent call last):
  File "", line 1, in 
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'

你可能感兴趣的:(知识,python,面向对象)