當前位置:首頁 » 編程語言 » pythonmeta

pythonmeta

發布時間: 2022-10-03 19:42:42

python怎麼動態創建類

首先我們建一個目錄 my_moles,其中包括三個文件

* init.py: 模塊文件
* my_mole.py: 測試用的模塊
* my_another_mole:
另一個測試用的模塊

my_mole.py
from my_moles.my_another_mole import *
class MyObject(object):
def test(self):
print 'MyObject.test'
MyObject1().test()
MyObject2().test()
MyAnotherObject().test()
class MyObject1(object):
def test(self):
print 'MyObject1.test'
class MyObject2(object):
def test(self):
print 'MyObject2.test'

my_another_mole.py
class MyAnotherObject(object):
def test(self):
print 'MyAnotherObject.test'

test.py
def createInstance(mole_name, class_name, *args, **kwargs):
mole_meta = __import__(mole_name, globals(), locals(), [class_name])
class_meta = getattr(mole_meta, class_name)
obj = class_meta(*args, **kwargs)
return obj
obj = createInstance("my_moles.my_mole", "MyObject")
obj.test()
MyObject.test
MyObject1.test
MyObject2.test
MyAnotherObject.test

⑵ 有沒有老師了解Python用於Meta分析的工具包

Python在科學計算領域,有兩個重要的擴展模塊:Numpy和Scipy。其中Numpy是一個用python實現的科學計算包。包括:

  • 一個強大的N維數組對象Array;

  • 比較成熟的(廣播)函數庫;

  • 用於整合C/C++和Fortran代碼的工具包;

  • 實用的線性代數、傅里葉變換和隨機數生成函數。

  • SciPy是一個開源的Python演算法庫和數學工具包,SciPy包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。其功能與軟體MATLAB、Scilab和GNU Octave類似。

    Numpy和Scipy常常結合著使用,Python大多數機器學習庫都依賴於這兩個模塊,繪圖和可視化依賴於matplotlib模塊,matplotlib的風格與matlab類似。Python機器學習庫非常多,而且大多數開源,主要有:

    1.scikit-learn

    scikit-learn是一個基於SciPy和Numpy的開源機器學習模塊,包括分類、回歸、聚類系列演算法,主要演算法有SVM、邏輯回歸、樸素貝葉斯、Kmeans、DBSCAN等,目前由INRI資助,偶爾Google也資助一點。

    項目主頁:

    https://pypi.python.org/pypi/scikit-learn/

    http://scikit-learn.org/

    https://github.com/scikit-learn/scikit-learn

    2.NLTK

    NLTK(Natural Language Toolkit)是Python的自然語言處理模塊,包括一系列的字元處理和語言統計模型。NLTK常用於學術研究和教學,應用的領域有語言學、認知科學、人工智慧、信息檢索、機器學習等。NLTK提供超過50個語料庫和詞典資源,文本處理庫包括分類、分詞、詞干提取、解析、語義推理。可穩定運行在Windows, Mac OS X和linux平台上.

    項目主頁:

    http://sourceforge.net/projects/nltk/

    https://pypi.python.org/pypi/nltk/

    http://nltk.org/

    3.Mlpy

    Mlpy是基於NumPy/SciPy的Python機器學習模塊,它是Cython的擴展應用。包含的機器學習演算法有:

    l回歸

    least squares,ridge regression, least angle regression,elastic net, kernel ridge regression,support vector machines(SVM),partial least squares(PLS)

    l分類

    linear discriminant analysis(LDA), Basicperceptron, Elastic Net,logistic regression, (Kernel) Support Vector Machines (SVM), Diagonal Linear Discriminant Analysis (DLDA), Golub Classifier, Parzen-based, (kernel) Fisher Discriminant Classifier, k-nearest neighbor, Iterative RELIEF, Classification Tree, Maximum Likelihood Classifier

    l聚類

    hierarchical clustering, Memory-saving Hierarchical Clustering,k-means

    l維度約減

    (Kernel)Fisher discriminant analysis(FDA), Spectral Regression Discriminant Analysis (SRDA), (kernel)Principal component analysis(PCA)

    項目主頁:

    http://sourceforge.net/projects/mlpy

    https://mlpy.fbk.eu/

    4.Shogun

    Shogun是一個開源的大規模機器學習工具箱。目前Shogun的機器學習功能分為幾個部分:feature表示,feature預處理,核函數表示,核函數標准化,距離表示,分類器表示,聚類方法,分布,性能評價方法,回歸方法,結構化輸出學習器。

    SHOGUN的核心由C++實現,提供Matlab、R、Octave、Python介面。主要應用在linux平台上。

    項目主頁:

    http://www.shogun-toolbox.org/

    5.MDP

    The Molar toolkit for Data Processing (MDP),用於數據處理的模塊化工具包,一個Python數據處理框架。

    從用戶的觀點,MDP是能夠被整合到數據處理序列和更復雜的前饋網路結構的一批監督學習和非監督學習演算法和其他數據處理單元。計算依照速度和內存需求而高效的執行。從科學開發者的觀點,MDP是一個模塊框架,它能夠被容易地擴展。新演算法的實現是容易且直觀的。新實現的單元然後被自動地與程序庫的其餘部件進行整合。MDP在神經科學的理論研究背景下被編寫,但是它已經被設計為在使用可訓練數據處理演算法的任何情況中都是有用的。其站在用戶一邊的簡單性,各種不同的隨時可用的演算法,及應用單元的可重用性,使得它也是一個有用的教學工具。

    項目主頁:

    http://mdp-toolkit.sourceforge.net/

    https://pypi.python.org/pypi/MDP/

⑶ <meta name="keywords" content="我是一隻鳥"/>python爬蟲怎麼定位到這個標簽

importrequests
importre

re_text=requests.get(url).text
re_content=re.findall('<metaname="keywords"content="(.*?)"/>',re_text)
print(re_content)

.*?表示非貪婪匹配,可以匹配到。

⑷ 如何在Python中使用static,class,abstract方法

方法在Python中是如何工作的

方法就是一個函數,它作為一個類屬性而存在,你可以用如下方式來聲明、訪問一個函數:

Python

1

2

3

4

5

6

7

8

>>> class Pizza(object):

... def __init__(self, size):

... self.size = size

... def get_size(self):

... return self.size

...

>>> Pizza.get_size

<unbound method Pizza.get_size>

Python在告訴你,屬性_get_size是類Pizza的一個未綁定方法。這是什麼意思呢?很快我們就會知道答案:

Python

1

2

3

4

>>> Pizza.get_size()

Traceback (most recent call last):

File "<stdin>", line 1, in <mole>

TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)

我們不能這么調用,因為它還沒有綁定到Pizza類的任何實例上,它需要一個實例作為第一個參數傳遞進去(Python2必須是該類的實例,Python3中可以是任何東西),嘗試一下:

Python

1

2

>>> Pizza.get_size(Pizza(42))

42

太棒了,現在用一個實例作為它的的第一個參數來調用,整個世界都清靜了,如果我說這種調用方式還不是最方便的,你也會這么認為的;沒錯,現在每次調用這個方法的時候我們都不得不引用這個類,如果不知道哪個類是我們的對象,長期看來這種方式是行不通的。

那麼Python為我們做了什麼呢,它綁定了所有來自類_Pizza的方法以及該類的任何一個實例的方法。也就意味著現在屬性get_size是Pizza的一個實例對象的綁定方法,這個方法的第一個參數就是該實例本身。

Python

1

2

3

4

>>> Pizza(42).get_size

<bound method Pizza.get_size of <__main__.Pizza object at 0x7f3138827910>>

>>> Pizza(42).get_size()

42

和我們預期的一樣,現在不再需要提供任何參數給_get_size,因為它已經是綁定的,它的self參數會自動地設置給Pizza實例,下面代碼是最好的證明:

Python

1

2

3

>>> m = Pizza(42).get_size

>>> m()

42

更有甚者,你都沒必要使用持有Pizza對象的引用了,因為該方法已經綁定到了這個對象,所以這個方法對它自己來說是已經足夠了。

也許,如果你想知道這個綁定的方法是綁定在哪個對象上,下面這種手段就能得知:

Python

1

2

3

4

5

6

7

>>> m = Pizza(42).get_size

>>> m.__self__

<__main__.Pizza object at 0x7f3138827910>

>>> # You could guess, look at this:

...

>>> m == m.__self__.get_size

True

顯然,該對象仍然有一個引用存在,只要你願意你還是可以把它找回來。

在Python3中,依附在類上的函數不再當作是未綁定的方法,而是把它當作一個簡單地函數,如果有必要它會綁定到一個對象身上去,原則依然和Python2保持一致,但是模塊更簡潔:

Python

1

2

3

4

5

6

7

8

>>> class Pizza(object):

... def __init__(self, size):

... self.size = size

... def get_size(self):

... return self.size

...

>>> Pizza.get_size

<function Pizza.get_size at 0x7f307f984dd0>

靜態方法

靜態方法是一類特殊的方法,有時你可能需要寫一個屬於這個類的方法,但是這些代碼完全不會使用到實例對象本身,例如:

Python

1

2

3

4

5

6

7

class Pizza(object):

@staticmethod

def mix_ingredients(x, y):

return x + y

def cook(self):

return self.mix_ingredients(self.cheese, self.vegetables)

這個例子中,如果把_mix_ingredients作為非靜態方法同樣可以運行,但是它要提供self參數,而這個參數在方法中根本不會被使用到。這里的@staticmethod裝飾器可以給我們帶來一些好處:

  • Python不再需要為Pizza對象實例初始化一個綁定方法,綁定方法同樣是對象,但是創建他們需要成本,而靜態方法就可以避免這些。

  • Python

    1

    2

    3

    4

    5

    6

  • >>> Pizza().cook is Pizza().cook

    False

    >>> Pizza().mix_ingredients is Pizza.mix_ingredients

    True

    >>> Pizza().mix_ingredients is Pizza().mix_ingredients

    True

  • 可讀性更好的代碼,看到@staticmethod我們就知道這個方法並不需要依賴對象本身的狀態。

  • 可以在子類中被覆蓋,如果是把mix_ingredients作為模塊的頂層函數,那麼繼承自Pizza的子類就沒法改變pizza的mix_ingredients了如果不覆蓋cook的話。

  • 類方法

    話雖如此,什麼是類方法呢?類方法不是綁定到對象上,而是綁定在類上的方法。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

  • >>> class Pizza(object):

    ... radius = 42

    ... @classmethod

    ... def get_radius(cls):

    ... return cls.radius

    ...

    >>>

    >>> Pizza.get_radius

    <bound method type.get_radius of <class '__main__.Pizza'>>

    >>> Pizza().get_radius

    <bound method type.get_radius of <class '__main__.Pizza'>>

    >>> Pizza.get_radius is Pizza().get_radius

    True

    >>> Pizza.get_radius()

    42

  • 無論你用哪種方式訪問這個方法,它總是綁定到了這個類身上,它的第一個參數是這個類本身(記住:類也是對象)。

    什麼時候使用這種方法呢?類方法通常在以下兩種場景是非常有用的:

  • 工廠方法:它用於創建類的實例,例如一些預處理。如果使用@staticmethod代替,那我們不得不硬編碼Pizza類名在函數中,這使得任何繼承Pizza的類都不能使用我們這個工廠方法給它自己用。

  • Python

    1

    2

    3

    4

    5

    6

    7

  • class Pizza(object):

    def __init__(self, ingredients):

    self.ingredients = ingredients

    @classmethod

    def from_fridge(cls, fridge):

    return cls(fridge.get_cheese() + fridge.get_vegetables())

  • 調用靜態類:如果你把一個靜態方法拆分成多個靜態方法,除非你使用類方法,否則你還是得硬編碼類名。使用這種方式聲明方法,Pizza類名明永遠都不會在被直接引用,繼承和方法覆蓋都可以完美的工作。

  • Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

  • class Pizza(object):

    def __init__(self, radius, height):

    self.radius = radius

    self.height = height

    @staticmethod

    def compute_area(radius):

    return math.pi * (radius ** 2)

    @classmethod

    def compute_volume(cls, height, radius):

    return height * cls.compute_area(radius)

    def get_volume(self):

    return self.compute_volume(self.height, self.radius)

  • 抽象方法

    抽象方法是定義在基類中的一種方法,它沒有提供任何實現,類似於Java中介面(Interface)裡面的方法。

    在Python中實現抽象方法最簡單地方式是:

    Python

    1

    2

    3

  • class Pizza(object):

    def get_radius(self):

    raise NotImplementedError

  • 任何繼承自_Pizza的類必須覆蓋實現方法get_radius,否則會拋出異常。

    這種抽象方法的實現有它的弊端,如果你寫一個類繼承Pizza,但是忘記實現get_radius,異常只有在你真正使用的時候才會拋出來。

    Python

    1

    2

    3

    4

    5

    6

    7

  • >>> Pizza()

    <__main__.Pizza object at 0x7fb747353d90>

    >>> Pizza().get_radius()

    Traceback (most recent call last):

    File "<stdin>", line 1, in <mole>

    File "<stdin>", line 3, in get_radius

    NotImplementedError

  • 還有一種方式可以讓錯誤更早的觸發,使用Python提供的abc模塊,對象被初始化之後就可以拋出異常:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

  • import abc

    class BasePizza(object):

    __metaclass__= abc.ABCMeta

    @abc.abstractmethod

    def get_radius(self):

    """Method that should do something."""

  • 使用abc後,當你嘗試初始化BasePizza或者任何子類的時候立馬就會得到一個TypeError,而無需等到真正調用get_radius的時候才發現異常。

    Python

    1

    2

    3

    4

  • >>> BasePizza()

    Traceback (most recent call last):

    File "<stdin>", line 1, in <mole>

    TypeError: Can't instantiate abstract class BasePizza with abstract methods get_radius

  • 混合靜態方法、類方法、抽象方法

    當你開始構建類和繼承結構時,混合使用這些裝飾器的時候到了,所以這里列出了一些技巧。

    記住,聲明一個抽象的方法,不會固定方法的原型,這就意味著雖然你必須實現它,但是我可以用任何參數列表來實現:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

  • import abc

    class BasePizza(object):

    __metaclass__= abc.ABCMeta

    @abc.abstractmethod

    def get_ingredients(self):

    """Returns the ingredient list."""

    class Calzone(BasePizza):

    def get_ingredients(self, with_egg=False):

    egg = Egg() if with_egg else None

    return self.ingredients + egg

  • 這樣是允許的,因為Calzone滿足BasePizza對象所定義的介面需求。同樣我們也可以用一個類方法或靜態方法來實現:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

  • import abc

    class BasePizza(object):

    __metaclass__= abc.ABCMeta

    @abc.abstractmethod

    def get_ingredients(self):

    """Returns the ingredient list."""

    class DietPizza(BasePizza):

    @staticmethod

    def get_ingredients():

    return None

  • 這同樣是正確的,因為它遵循抽象類BasePizza設定的契約。事實上get_ingredients方法並不需要知道返回結果是什麼,結果是實現細節,不是契約條件。

    因此,你不能強制抽象方法的實現是一個常規方法、或者是類方法還是靜態方法,也沒什麼可爭論的。從Python3開始(在Python2中不能如你期待的運行,見issue5867),在abstractmethod方法上面使用@staticmethod和@classmethod裝飾器成為可能。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

  • import abc

    class BasePizza(object):

    __metaclass__= abc.ABCMeta

    ingredient = ['cheese']

    @classmethod

    @abc.abstractmethod

    def get_ingredients(cls):

    """Returns the ingredient list."""

    return cls.ingredients

  • 別誤會了,如果你認為它會強制子類作為一個類方法來實現get_ingredients那你就錯了,它僅僅表示你實現的get_ingredients在BasePizza中是一個類方法。

    可以在抽象方法中做代碼的實現?沒錯,Python與Java介面中的方法相反,你可以在抽象方法編寫實現代碼通過super()來調用它。(譯註:在Java8中,介面也提供的默認方法,允許在介面中寫方法的實現)

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

  • import abc

    class BasePizza(object):

    __metaclass__= abc.ABCMeta

    default_ingredients = ['cheese']

    @classmethod

    @abc.abstractmethod

    def get_ingredients(cls):

    """Returns the ingredient list."""

    return cls.default_ingredients

    class DietPizza(BasePizza):

    def get_ingredients(self):

    return ['egg'] + super(DietPizza, self).get_ingredients()

  • 這個例子中,你構建的每個pizza都通過繼承BasePizza的方式,你不得不覆蓋get_ingredients方法,但是能夠使用默認機制通過super()來獲取ingredient列表。

    打賞支持我翻譯更多好文章,謝謝!

⑸ python新手常見的報錯有哪些

1.NameError變數名錯誤
報錯:
>>> print a
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
NameError: name 'a' is not defined
解決方案:
先要給a賦值。才能使用它。在實際編寫代碼過程中,報NameError錯誤時,查看該變數是否賦值,或者是否有大小寫不一致錯誤,或者說不小心將變數名寫錯了。
註:在Python中,無需顯示變數聲明語句,變數在第一次被賦值時自動聲明。
>>> a=1
>>> print a
1
2.IndentationError代碼縮進錯誤
代碼:
a=1
b=2
if a<b:
print a
報錯:
IndentationError: expected an indented block
原因:
縮進有誤,python的縮進非常嚴格,行首多個空格,少個空格都會報錯。這是新手常犯的一個錯誤,由於不熟悉python編碼規則。像def,class,if,for,while等代碼塊都需要縮進。
縮進為四個空格寬度,需要說明一點,不同的文本編輯器中製表符(tab鍵)代表的空格寬度不一,如果代碼需要跨平台或跨編輯器讀寫,建議不要使用製表符。
解決方案:
a=1
b=2
if a<b:
print a
3.AttributeError對象屬性錯誤
報錯:
>>> import sys
>>> sys.Path
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
AttributeError: 'mole' object has no attribute 'Path'
原因:
sys模塊沒有Path屬性。
解決方案:
python對大小寫敏感,Path和path代表不同的變數。將Path改為path即可。
>>> sys.path
['', '/usr/lib/python2.6/site-packages']
python知識拓展:
使用dir函數查看某個模塊的屬性
>>> dir(sys)
['__displayhook__', '__doc__', '__egginsert', '__excepthook__', '__name__', '__package__', '__plen', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_mole_names', 'byteorder', 'call_tracing', 'callstats', 'right', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'moles', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
4.TypeError類型錯誤
4.1入參類型錯誤
代碼:
t=('a','b','c')
for i in range(t):
print a[i]
報錯:
TypeError: range() integer end argument expected, got tuple.
原因:
range()函數期望的入參是整型(integer),但卻給的入參為元組(tuple)
解決方案:
將入參元組t改為元組個數整型len(t)
將range(t)改為range(len(t))

⑹ python安裝後設置了一個環境變數,運行cmd後輸入python後顯示這個,說明我的運行成功嗎

您好,恭喜安裝成功了,第一行顯示的就是python解釋器版本號3.7你可以輸入簡單一行python代碼,print("hello world")

⑺ python urllib2抓不到meta跳轉的連接,怎麼辦

可能你不太了解HTTP協議的原因,在你寫自動抓取網頁內容代碼時,需要考慮一下協議內部的問題,由於你碰到了meta-refresh這個問題,沒有實現自動跳轉的功能。我給你的思路是,有兩種吧,一種是用開源庫一種是偽裝。開源的爬蟲庫有scrapy和beautifulSoup,為了便於你分析Http保文內容可以用fiddler和burpsuit工具查看並自行分析。在這里我就不貼代碼了,給你一個例子比較好的鏈接http://jecvay.com/2014/09/python3-web-bug-series3.html

⑻ Python 有什麼奇技淫巧

看看下面這些算不算1.元類(metaclass)PyPy的源碼里有個pair和extendabletype"""Twomagictricksforclasses:classX:__metaclass__=extendabletype#insomeotherfileclass__extend__(X):#hthesecondtrick,whichletsyoubuildmethodswhose'self':class__extend__(pairtype(X,Y)):attribute=42defmethod((x,y),other,arguments):pair(x,y).attributepair(x,y).method(other,arguments)atgointothepair(),withtheusualrulesofmethod/attributeoverridingin(pairsof)subclasses.Formoreinformation,seetest_pairtype."""classextendabletype(type):"""Atypewithasyntaxtrick:'class__extend__(t)''t'insteadofcreatinganewsubclass."""def__new__(cls,name,bases,dict):ifname=='__extend__':forclsinbases:forkey,valueindict.items():ifkey=='__mole__':continue#?setattr(cls,key,value)returnNoneelse:returnsuper(extendabletype,cls).__new__(cls,name,bases,dict)defpair(a,b):"""Returnapairobject."""tp=pairtype(a.__class__,b.__class__)returntp((a,b))#={}defpairtype(cls1,cls2):"""type(pair(a,b))ispairtype(a.__class__,b.__class__)."""try:pair=pairtypecache[cls1,cls2]exceptKeyError:name='pairtype(%s,%s)'%(cls1.__name__,cls2.__name__)bases1=[pairtype(base1,cls2)forbase1incls1.__bases__]bases2=[pairtype(cls1,base2)forbase2incls2.__bases__]bases=tuple(bases1+bases2)or(tuple,)#'tuple':ultimatebasepair=pairtypecache[cls1,cls2]=extendabletype(name,bases,{})returnpair先說extendabletype。嘛其實注釋已經說得聽明白了,就是一個C#裡面的partialclass的Python實現。然後是pair和pairtype。pairtype就是根據兩個類創建一個新的類,這個類繼承自使用這兩個類的基類構造的pairtype(有點繞……)或者tuple。有啥用呢?可以拿來實現multimethod。class__extend__(pairtype(int,int)):deffoo((x,y)):print'int-int:%s-%s'%(x,y)class__extend__(pairtype(bool,bool)):defbar((x,y)):print'bool-bool:%s-%s'%(x,y)pair(False,True).foo()#prints'int-int:False,True'pair(123,True).foo()#prints'int-int:123,True'pair(False,True).bar()#prints'bool-bool:False,True'pair(123,True).bar()#Oops,nosuchmethod好像這個例子里元類只是個打輔助的角色,好玩的都在那個pair里……再換一個。classGameObjectMeta(type):def__new__(mcls,clsname,bases,_dict):fork,vin_dict.items():ifisinstance(v,(list,set)):_dict[k]=tuple(v)#mutableobjnotallowedcls=type.__new__(mcls,clsname,bases,_dict)all_gameobjects.add(cls)forbinbases:game_objects_hierarchy.add((b,cls))returncls@staticmethoddef_mp_gameobject_hierarchy():withopen('/dev/shm/gomap.dot','w')asf:f.write('digraph{\nrankdir=LR;\n')f.write('\n'.join(['"%s"->"%s";'%(a.__name__,b.__name__)fora,bingame_objects_hierarchy]))f.write('}')def__setattr__(cls,field,v):type.__setattr__(cls,field,v)iffieldin('ui_meta',):returnlog.warning('SetAttr:%s.%s=%s'%(cls.__name__,field,repr(v)))這個是從我寫的三國殺游戲中提取的一段代碼(點我簽名上的鏈接)。大意就是把class上所有可變的容器都換成不可變的,然後記錄下繼承關系。曾經被這個問題坑過,class上的值是全局共享的,邏輯代碼一不小心修改了class上的值,單機測試的時候是測不出來的,然後放到線上……就悲劇了……當時絞盡腦汁沒有想到是這個問題硬生生的回滾了……發現了問題之後就加上了這個東西,不允許修改class上的東西。記錄下繼承關系是為了畫類圖。還有就是常用的做數據注入metadata={}defgen_metafunc(_for):defmetafunc(clsname,bases,_dict):meta_for=getattr(_for,clsname)meta_for.ui_meta=UIMetaDescriptor()ifmeta_forinmetadata:raiseException('%sui_metaredefinition!'%meta_for)metadata[meta_for]=_.thbimportcharacters__metaclass__=gen_metafunc(characters.sakuya)classSakuya:#於是這個就不是類了,而是作為數據存到了metadata這個dict里char_name=u'十六夜咲夜'port_image='thb-portrait-sakuya'figure_image='thb-figure-sakuya'miss_sound_effect='thb-cv-sakuya_miss'description=(u'|DB完全瀟灑的PAD長十六夜咲夜體力:4|r\n\n'u'|G月時計|r:|B鎖定技|r,准備階段開始時,你執行一個額外的出牌階段。\n\n'u'|G飛刀|r:你可以將一張裝備牌當【彈幕】使用或打出。按此法使用的【彈幕】無距離限制。\n\n'u'|DB(畫師:小D@星の妄想鄉,CV:VV)|r')Ruby黨不要噴,我知道你們可以做的更優雅……2.Python沙盒逃逸刷新三觀的Python代碼3.PEP302NewImportHook最近在把剛才提到的純Python游戲向Unity引擎上移植。玩過Unity的就會知道,Unity的游戲的資源都是打包在一起的,沒有單獨的文件,Python解釋器就不高興了……於是寫了importhook,用Unity提供的API來讀py文件。#-*-coding:utf-8-*-#--stdlib--importimpimportsys#--thirdparty--#--own--fromclrimportUnityEngine,WarpGateController#--code--classUnityResourceImporter(object):known_builtin=('sys','imp','cStringIO','gevent_core','gevent_ares','gevent_util','gevent_semaphore','msgpack_packer','msgpack_unpacker','UnityEngine',)def__init__(self,bases,unity_loader):self.bases=basesself.last_fullname=''self.last_text=''self.last_ispkg=Falseself.unity_load=unity_loaderdeffind_mole(self,fullname,path=None):iffullnameinsys.moles:returnselfhead=fullname.split('.')[0]ifheadinself.known_builtin:returnNonerst=self.do_load_mole(fullname)ifrst:self.last_text,self.last_ispkg=rstself.last_fullname=fullnamereturnselfelse:returnNonedefload_mole(self,fullname):iffullnameinsys.moles:returnsys.moles[fullname]iffullname!=self.last_fullname:self.find_mole(fullname)try:code=self.last_textispkg=self.last_ispkgmod=sys.moles.setdefault(fullname,imp.new_mole(fullname))mod.__file__=""%fullnamemod.__loader__=selfifispkg:mod.__path__=[]mod.__package__=fullnameelse:mod.__package__=fullname.rpartition('.')[0]co=compile(code,mod.__file__,'exec')exec(co,mod.__dict__)returnmodexceptExceptionase:UnityEngine.Debug.LogError('Errorimporting%s%s'%(fullname,e))raiseImportError(e)defdo_load_mole(self,fullname):fn=fullname.replace('.','/')asset=self.try_load(fn+'.py')ifassetisnotNone:returnasset,Falseasset=self.try_load(fn+'/__init__.py')ifassetisnotNone:returnasset,Truedeftry_load(self,filename):forbinself.bases:asset=self.unity_load(b+filename)ifassetisnotNone:returnassetreturnNonesys.meta_path.append(UnityResourceImporter(['Python/THBattle/','Python/Site/','Python/Stdlib/',],WarpGateController.GetTextAsset))需要的extensionmole都靜態編譯到解釋器里了,所以沒考慮。4.可以批量執行操作的listclassBatchList(list):def__getattribute__(self,name):try:list_attr=list.__getattribute__(self,name)returnlist_attrexceptAttributeError:passreturnlist.__getattribute__(self,'__class__')(getattr(i,name)foriinself)def__call__(self,*a,**k):returnlist.__getattribute__(self,'__class__')(f(*a,**k)forfinself)classFoo(object):def__init__(self,v):self.value=vdeffoo(self):print'Foo!',self.valuefoo=Foo(1)foo.foo()#Foo!1foos=BatchList(Foo(i)foriinxrange(10))foos.value#BatchList([0,1,2,3,,9])foos.foo()#你能猜到的

⑼ python的file meta怎麼獲取size

舉幾個代碼案例進行說明,代碼如下: # -*- coding: utf-8 -*- # 運行環境:Python3.4 #datetime類 #datetime是date與time的結合體,包括date與time的所有信息。 #它的構造函數如下: #datetime. datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ) #各參數的含義與date、time的構造函數中的一樣,要注意參數值的范圍。

熱點內容
安卓上哪裡下大型游戲 發布:2024-12-23 15:10:58 瀏覽:187
明日之後目前適用於什麼配置 發布:2024-12-23 14:56:09 瀏覽:51
php全形半形 發布:2024-12-23 14:55:17 瀏覽:826
手機上傳助手 發布:2024-12-23 14:55:14 瀏覽:731
什麼樣的主機配置吃雞開全效 發布:2024-12-23 14:55:13 瀏覽:828
安卓我的世界114版本有什麼 發布:2024-12-23 14:42:17 瀏覽:708
vbox源碼 發布:2024-12-23 14:41:32 瀏覽:275
詩經是怎麼存儲 發布:2024-12-23 14:41:29 瀏覽:657
屏蔽視頻廣告腳本 發布:2024-12-23 14:41:24 瀏覽:418
php解析pdf 發布:2024-12-23 14:40:01 瀏覽:816