python小知识点

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中只有值传递。

猜你喜欢

转载自w-sl.iteye.com/blog/2320569