1.python中__init__ 和__new__方法有什么不同的呢?
# -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if __name__ == '__main__': piglei = Person('piglei', 24) print piglei
这是__init__最基础的用法,但是__init__并不是实例化一个类第一个被调用的方法,__new__才是。
1.p = Person(name, age)
2.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, ... ...) 这样的方式),
3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。
但是说了这么多,__new__最通常的用法是什么呢,我们什么时候需要__new__?
__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。
class PositiveInteger(int): def __init__(self, value): super(PositiveInteger, self).__init__(self, abs(value)) i = PositiveInteger(-3) print i
但运行后会发现,结果根本不是我们想的那样,我们任然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。
class PositiveInteger(int): def __new__(cls, value): return super(PositiveInteger, cls).__new__(cls, abs(value)) i = PositiveInteger(-3) print (i) class Positiveint(int): def __new__(cls,ints): ints=abs(ints) return int.__new__(cls,ints)
i = PositiveInteger(-3)
print (i)
2.eval() && repr()
eval将python的字符串当成表达式来求值,并且返回计算结果。eval('1+1') 返回2
repr相反,他将表达式转化成字符串。
通常情况下eval(repr(object))=object
eg:eval(str(1+1)) 返回2
eval(repr(1=1)) 返回2
但是eval(str(datetime.date.today))返回的却是1986 ,很明显不是datetime.date.today的值。
但是我们用eval(repr(datetime.date.today))返回的就是 datetime.date.today(2016.10.20)
这里还涉及到r% 和s%:我们的r% 采用的是repr的形式,我们的s%采用的是str的形式。
str的形式是给我们的用户看的。而我们的repr是给python看的。
3.java Map和Python dict循环
for(Map.Entry<Integer,String> entry:map.entrySet()){ entry.getKey(); entry.getValue(); }
for i in dict.keys: dict[i]
4.python这种一切都是对象,只有引用传递,java中只有值传递。