国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python 屬性搜索優先級和descriptor

NusterCache / 901人閱讀

摘要:屬性搜索優先級和定義數據描述符數據描述符非數據描述符一般情況數據型描述符非數據型描述符類調用描述符如果被重寫上面代碼介紹的東西會被覆蓋掉除非函數內部調用否則別這么干例子

屬性搜索優先級和descriptor
########################
# 定義
########################

# 數據描述符
class DataDesc(object):
    def __init__(self, *args, **kwargs):
        pass

    def __get__(self, instance, cls):
        print(instance is None)
        return "DataDesc"

    def __set__(self, instance, value):
        return None

    def __delete__(self, instance):
        return None


# 數據描述符
class DataDesc2(object):
    def __init__(self, *args, **kwargs):
        pass

    def __get__(self, instance, cls):
        return "DataDesc2"

    def __set__(self, instance, value):
        return None


# 非數據描述符
class NonDataDesc(object):
    def __init__(self, *args, **kwargs):
        pass

    def __get__(self, instance, cls):
        print(instance is None)
        return "NonDataDesc"


class Foo(object):
    test_attr = DataDesc()
    test_attr2 = DataDesc()
    test_attr3 = NonDataDesc()
    test_attr4 = "test_attr4"

    def __getattr__(self, item):
        return "hehe__getattr__"


########################
# 一般情況
########################
foo = Foo()
"""
1. foo.__dict__["test_attr4"]
2. for cls in Foo.__mro__:
       cls.__dict__["test_attr4"]
3. foo.__getattr__("test_attr4")
"""
print(foo.test_attr4)
foo.__dict__["test_attr4"] = 666
print(foo.test_attr4)
print(id(foo.test_attr4) == id(foo.__dict__["test_attr4"]))
foo.__dict__.pop("test_attr4")
print(foo.test_attr4)
print(foo.test_attr5)
print(foo.__getattr__("test_attr5"))

########################
# 數據型描述符
########################
foo = Foo()
"""
1. type(foo).__dict__["test_attr"].__get__(foo, type(foo))
2. foo.__dict__["test_attr4"]
3. for cls in Foo.__mro__:
       cls.__dict__["test_attr4"]
4. foo.__getattr__("test_attr4")
"""
print(foo.test_attr)
foo.__dict__["test_attr"] = 666
print(foo.test_attr)
print(id(foo.test_attr) == id(foo.__dict__["test_attr"]))
delattr(Foo, "test_attr")
print(foo.test_attr)
print(id(foo.test_attr) == id(foo.__dict__["test_attr"]))

########################
# 非數據型描述符
########################
foo = Foo()
"""
1. foo.__dict__["test_attr4"]
2. type(foo).__dict__["test_attr"].__get__(foo, type(foo))
3. for cls in Foo.__mro__:
       cls.__dict__["test_attr4"]
4. foo.__getattr__("test_attr4")
"""
print(foo.test_attr3)
foo.__dict__["test_attr3"] = 666
print(foo.test_attr3)
print(id(foo.test_attr3) == id(foo.__dict__["test_attr3"]))
del foo.test_attr3
print(foo.test_attr3)

########################
# 類調用描述符
########################
"""
FOO.__dict__["test_attr"].__get__(None, FOO)
"""
print(Foo.test_attr2)
print(Foo.test_attr3)

########################
# __getattribute__
########################
"""
如果被重寫,上面代碼介紹的東西會被覆蓋掉
除非函數內部調用object.__getattribute__
否則別這么干
"""


class Foo2(object):
    test_attr = DataDesc()
    test_attr2 = DataDesc()
    test_attr3 = NonDataDesc()
    test_attr4 = "test_attr4"

    def __getattribute__(self, item):
        return "in __getattribute__"


foo = Foo2()
print(foo.test_attr3)

########################
# 例子
########################
import time


class LazyProperty(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, cls):
        if instance is not None:
            val = self.func(instance)
            setattr(instance, self.func.__name__, val)
            return val


class Foo3(object):
    @LazyProperty
    def method(self):
        time.sleep(5)
        return 666


foo3 = Foo3()
time1 = time.time()
print(foo3.method)
time2 = time.time()
print(time2 - time1)
print(foo3.method)
print(time.time() - time2)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45184.html

相關文章

  • 如何正確地使用Python屬性描述符

    摘要:描述符登場什么是描述符一般來說,描述符是一個具有綁定行為的對象屬性,其屬性的訪問被描述符協議方法覆寫。先看如何用描述符來解決上面邏輯重復的問題。 關于@property裝飾器 在Python中我們使用@property裝飾器來把對函數的調用偽裝成對屬性的訪問。 那么為什么要這樣做呢?因為@property讓我們將自定義的代碼同變量的訪問/設定聯系在了一起,同時為你的類保持一個簡單的訪問...

    huayeluoliuhen 評論0 收藏0
  • Python中類的屬性具有惰性求值的能力

    摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當不需要這個屬性時就能避免進行無意義的計算,同時又能阻止該屬性重復進行計算。 起步 我們希望將一個只讀的屬性定義為 property 屬性方法,只有在訪問它時才進行計算,但是,又希望把計算出的值緩存起來,不要每次訪問它時都重...

    NervosNetwork 評論0 收藏0
  • Pythondescriptor(上)

    摘要:事實上實例的實現方式與上面的實例類似。其次,為了實現確實對屬性的調用順序做出了相應的調整,這些將會的下中介紹。參考資料如何理解的中基于的一些概念上中基于的一些概念下的官方文檔描述符解密的官方文檔 Python 在 2.2 版本中引入了descriptor(描述符)功能,也正是基于這個功能實現了新式類(new-styel class)的對象模型,同時解決了之前版本中經典類 (classi...

    yexiaobai 評論0 收藏0
  • opencv python 特征匹配

    摘要:匹配器匹配非常簡單,首先在第一幅圖像中選取一個關鍵點然后依次與第二幅圖像的每個關鍵點進行描述符距離測試,最后返回距離最近的關鍵點對于匹配器,首先我們必須使用創建對象。 Feature Matching Brute-Force匹配器 Brute-Force匹配非常簡單,首先在第一幅圖像中選取一個關鍵點然后依次與第二幅圖像的每個關鍵點進行(描述符)距離測試,最后返回距離最近的關鍵點. 對于...

    macg0406 評論0 收藏0
  • JS 裝飾器,一篇就夠

    摘要:的裝飾器中的同樣借鑒了這個語法糖,不過依賴于的方法。等同于也就是說,裝飾器是一個對類進行處理的函數。別名或裝飾器在控制臺顯示一條警告,表示該方法將廢除。有了裝飾器,就可以改寫上面的代碼。 更多文章,請在Github blog查看 在 ES6 中增加了對類對象的相關定義和操作(比如 class 和 extends ),這就使得我們在多個不同類之間共享或者擴展一些方法或者行為的時候,變得并...

    learning 評論0 收藏0

發表評論

0條評論

NusterCache

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<