python 对比学习
python和java面向对象的不同
1.属性和方法
java中类的属性(static)除外,对象全部独立拥有;
而python中类的属性,其实例对象一个字段都没有.底层是这么搞的: 对象object获取属性时,如果自己没有并不报错,而是去类中找,找不到才报错.
方法和java一样,普通的方法是对象的,要申明为类的静态方法必须使用@classmethod来表示是类的静态变量
2.构造方法:
java可以有多个,更加参数的多少决定
而python没有方法重载,故没有多个构造方法
一。小知识点:
1.python没有contains,使用find返回查到的元素的位置(只查一个符合的)
2.python的数组和集合添加元素不是add,使用append(快速构建list可是使用range(10) = [0,1,2,3,4,5,6,7,8,9])
3.python的set添加元素add,删除元素remove(和java一样)
4.fn(*x) x表示一个tuple; 而 fn(**x) x表示一个字典,而且对该字典you要求,key必须为str,同时fn(**x)还有个特殊写法,直接给x=xxx,y=xxx,简直太牛逼了。
5.高阶函数一般用这种log('info'),包含了一个参数的装饰器。 首先不带参数的装饰器(2阶即可):
第一阶:修饰的形参函数, 第二阶:函数的参数
def log1(fn): #fn:装饰的函数
def wapper(*args,**kw): #fn的参数
print 'log1日志:'
return fn(*args, **kw)
return wapper
@log1
def mytest(**kw):
sys.stdout.write('mytest函数执行,参数为:')
for x,y in kw.items():
sys.stdout.write(str(x) + ':' + str(y) + ', ')
但是如果包含了参数的,则需要三阶。 第一阶:装饰器所带参数作为形参,第二阶:修饰的形参函数, 第三阶:函数的参数
def log(txt):#一阶txt是自己的参数
def wapper(fn): #二阶这里拿到装饰函数的形参fn
def wapper2(*args,**kw): #三阶拿到装饰函数的参数
sys.stdout.write(txt+'级别日志:')
return fn(*args, **kw)
return wapper2
return wapper
@log('info')
def test(**kw):
sys.stdout.write('test函数执行,参数为:')
for x,y in kw.items():
sys.stdout.write(str(x) + ':' + str(y) + ', ')
test(x=1,y=2)
6.django总update和insert都可以通过save方法实现,到底是insert还是update,默认通过主键是否有值来判断。 如果我们确认只需要insert,则使用 对象.save(force_insert=true,using='哪个数据库');
如果我们确认只需要update,则使用 对象.save(force_update=True,update_fields=['aaa','bbb'])