SQL對冗余數據的刪除反復記載只保存單條的解釋。本站提示廣大學習愛好者:(SQL對冗余數據的刪除反復記載只保存單條的解釋)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL對冗余數據的刪除反復記載只保存單條的解釋正文
上篇文章簡略引見了python中描寫器(Descriptor)的概念和應用,有心的同窗估量曾經Get√了該技巧。本篇文章經由過程一個Descriptor的應用場景再次給出一個案例,讓不懂得情形的同窗可以更輕易懂得。
先說說decorator
這兩個單詞確切是有些類似,同時在應用中也是形影不離。這也給天然成了懂得上的艱苦,說裝潢器和描寫器究竟是怎樣回事,為何非得用一個@符號再加上描寫器才行。
許多文章也都把這倆聯合著講,我本身看完以後都邑認為很繞。其實進修一個常識點,和做項目開辟一個功效是一樣的。在功效拆分的時刻我們都邑盡可能的把義務拆分的足夠小,然後才分派到開辟者頭上。如許包管各個義務的自力性,完全性,而且易於做進度治理。在義務開辟的時刻也不克不及把你的義務都放到一個函數/接口中去做,以免各功效間發生高耦合的狀態,招致前期難以保護。
再說回到進修一個技巧點,假如你老是測驗考試一會兒就要控制兩個或多個技巧點,成果能夠是忙活了半天,發明照樣蒙頭轉向。
擦,似乎扯遠了。
說Descriptor是Descriptor, Decorator是Decorator,碰到不懂的處所,各個擊破,哪裡不懂點哪裡。所以先說Decorator, 症結點是你要認識到這就是一個語法糖 。所謂語法糖就是讓你可以用簡略的方法寫代碼。實質上裝潢器(Decorator)就是如許:
def decorator(func):
def wrapper():
print 'in decorator'
func()
return wrapper
def func():
print 'in func'
# 把func裝潢一下
func = decorator(func) # 右邊的func實際上是誰人wrapper, 你履行它的時刻會,它會幫你履行func()
# 同等於你在界說func的時刻加上@
@decorator
def func():
print 'in func'
正題:經由過程Descriptor來做一個類級的Property
罕見的Property是如許的:
class Foo(object):
_name = 'the5fire'
@property
def name(self):
return self._name
這中property的應用,是實例級的運用。由於只要在 foo = Foo() 以後,才可以 foo.name 。
然則假如我須要一個類級的屬性應當怎樣做呢,就像是 classmethod一樣,不須要實例化類我便可以挪用。對應的需求是如許的,界說了一個基類DBManage:
class DBManage(object):
@classmethod
def table_name(cls):
return cls.__name__.lower()
@classmethod
def select_all(cls):
sql = "SELECT * FROM %s""" % cls.table_name()
# 履行這個語句的代碼
return result
這其實一個對應著數據庫中某張表的基本模子,我願望其他的Model都來繼續它,然後可以重用這個table_name的辦法(今朝照樣辦法)。
我只須要這麼界說User模子便可:
class User(DBManage):
pass
然後這麼界說Post模子:
class Post(DBManage):
pass
如許我假如須要查一切的User數據,只須要 User.select_all() 便可,同理Post也是如斯 Post.select_all() 。但此時發明一個有點不爽的工作。那就是基類中的 cls.table_name() 這個代碼,table_name看起來就是屬性,卻須要用挪用辦法的方法獲得。不當。
因而自界說了一個classproperty:
class classproperty(object):
def __init__(self, func):
self.func = func
def __get__(self, instance, klass):
return self.func(klass)
這須要如許,我在DBManage中的代碼便可以改成:
class DBManage(object):
@classproperty
def table_name(cls):
return cls.__name__.lower()
@classmethod
def select_all(cls):
sql = "SELECT * FROM %s""" % cls.table_name # 何等直不雅
這就是Descriptor別的的一個應用案例了。
能夠有人或有一個小疑問:為毛你不是在sql賦值時直接 sql = "SELECT * FROM %s" % cls.__name__.lower() 。這個成績,問的異常好,緣由就一個字:懶。懶得今後每次都得敲那末多代碼。