小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何在__init__中獲取當前的Python類名,而不管“self”的類?

 印度阿三17 2019-08-28

我有很多類,有這樣的代碼.每個__init__都會啟動一個線程和一個帶有該類名稱的記錄器.如何在__init__中以字符串形式獲取當前類的名稱?請注意,self可能不是當前類的實例,因此以下內(nèi)容并非萬無一失.

from threading import Thread
import logging

def myClassName(myclass):
    myclass._class_name = myclass.__name__
    return myclass

@myClassName
class SomeClass(object):
    def __init__(self):
        class_name = type(self)._class_name
        print "My class name in __init__ is", class_name
        self.thread = Thread(name=class_name)
        self.logger = logging.getLogger(class_name)

更新:

澄清:

>我想要定義類的名稱,而不是類的名稱
傳入的對象.
>我不想硬編碼類的名稱.
>我希望能夠輕松地將示例從一個腳本復制/粘貼到
另一個,并且對獨特類名的提及越少越好.
(繼承不是很有效,因為有足夠的自定義
差異讓它變得尷尬.但不小心留下了名字
錯誤的類是一個難以找到的bug.)

解決方法:

在Python 3中,這非常簡單,我們可以使用__class__單元變量來獲取當前類.

在Python 2中,我們可以通過使用元類在函數(shù)globals范圍中注入類的名稱并稍后清理它來實現(xiàn)類似的功能.

from functools import wraps
from types import FunctionType


def decorate(func, class_name):
    @wraps(func)
    def wrapper(*args, **kwargs):
        sentinel = object()
        actual_value = func.__globals__.get('__class__', sentinel)
        func.__globals__['__class__'] = class_name
        try:
            result = func(*args, **kwargs)
        finally:
            if actual_value is sentinel:
                del func.__globals__['__class__']
            else:
                func.__globals__['__class__'] = actual_value
        return result
    return wrapper


class Meta(type):
    def __new__(cls, name, bases, attrs):
        for k, v in attrs.items():
            if isinstance(v, FunctionType):
                attrs[k] = decorate(v, name)
        return type.__new__(cls, name, bases, attrs)


class A:
    __metaclass__ = Meta
    def func(self):
        print(__class__)
        print('Inside A')


class B(A):
    def func(self):
        print(__class__)
        print('Inside B')
        super(B, self).func()


B().func()

輸出:

B
Inside B
A
Inside A

要將__class__變量作為類對象本身,我們可以進行一些更改:

def decorate(func, cls):
    @wraps(func)
    def wrapper(*args, **kwargs):
        sentinel = object()
        actual_value = func.__globals__.get('__class__', sentinel)
        func.__globals__['__class__'] = cls
        try:
            result = func(*args, **kwargs)
        finally:
            if actual_value is sentinel:
                del func.__globals__['__class__']
            else:
                func.__globals__['__class__'] = actual_value
        return result
    return wrapper


class Meta(type):
    def __new__(cls, name, bases, attrs):
        cls = type.__new__(cls, name, bases, attrs)
        for k, v in attrs.items():
            if isinstance(v, FunctionType):
                setattr(cls, k, decorate(v, cls))
        return cls

現(xiàn)在輸出將是:

<class '__main__.B'>
Inside B
<class '__main__.A'>
Inside A
來源:https://www./content-1-419001.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多