python - title大小 - subplot matplotlib title




從str或int繼承 (4)

仔細閱讀之後,這是繼承str的另一種嘗試。 從其他答案的變化是使用super(TitleText, cls).__new__在正確的類中創建實例。 這個似乎在使用時表現得像str,但允許我覆蓋一個方法:

class TitleText(str):
    title_text=""
    def __new__(cls,content,title_text):
        o=super(TitleText, cls).__new__(cls,content)
        o.title_text = title_text
        return o

    def title(self):
        return self.title_text

>>> a=TitleText('name','A nice name')
>>> a
'name'
>>> a[0]
'n'
>>> a[0:2]
'na'
>>> a.title()
'A nice name'

這使您可以正確切片和下標。 這是用來幹嘛的? 用於在管理員索引頁面中重命名Django應用程序。

為什麼我在創建一個繼承自str(或者也來自int)的類時遇到問題

class C(str):
   def __init__(self, a, b):
     str.__init__(self,a)
     self.b = b

C("a", "B")

TypeError: str() takes at most 1 argument (2 given)

如果我嘗試使用int而不是str ,同樣會發生,但它適用於自定義類。 我需要使用__new__而不是__init__ ? 為什麼?


在不可變類型的情況下使用__new__

class C(str):
    def __new__(cls, content, b):
        return str.__new__(cls, content)

    def __str__(self):
        return str.__str__(self)

a=C("hello", "world")
print a

print返回hello

Python字符串是不可變類型。 調用函數__new__來創建對象C的新實例。 here函數基本上是存在的,允許here類型繼承。


繼承內置類型很少值得。 你必須處理好幾個問題而且你並沒有獲得太多的好處。

使用構圖幾乎總是更好。 您可以將str對象保留為屬性,而不是繼承str

class EnhancedString(object):
     def __init__(self, *args, **kwargs):
         self.s = str(*args, **kwargs)

您可以手動或自動使用__getattr__推遲您想要在底層str self.s上工作的任何方法。

話雖這麼說,需要你自己的字符串類型應該讓你停下來。 有許多類應該將字符串存儲為其主要數據,但是您通常希望使用strunicode (後者,如果您要表示文本)來表示字符串的一般表示。 (一個常見的例外是如果您需要使用UI工具包的字符串類型。)如果您想為字符串添加功能,請嘗試使用對字符串而不是新對象進行 操作的函數 作為字符串 ,您的代碼更簡單,與其他人的程序更兼容。


>>> class C(str):
...     def __new__(cls, *args, **kw):
...         return str.__new__(cls, *args, **kw)
... 
>>> c = C("hello world")
>>> type(c)
<class '__main__.C'>

>>> c.__class__.__mro__
(<class '__main__.C'>, <type 'str'>, <type 'basestring'>, <type 'object'>)

由於在構造對象之後調用__init__ ,因此修改不可變類型的值為時已晚。 注意__new__是一個classmethod,所以我調用了第一個參數cls

有關更多信息,請參見here

>>> class C(str):
...     def __new__(cls, value, meta):
...         obj = str.__new__(cls, value)
...         obj.meta = meta
...         return obj
... 
>>> c = C("hello world", "meta")
>>> c
'hello world'
>>> c.meta
'meta'




new-operator