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
# 不过需要传入的是,这个函数的实例化对象
print Program.get_age(program)
ClassName.get_class_name()
# 例如下面这个函数
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 先调用__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方法,存在就打印出方法的内存地址。
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'