day22学習のまとめ

クラスメソッド

何がそれをクラスメソッド?

クラスメソッドは、メソッドがクラスにバインドするために使用されるように、内装方法は、使用することができ、デコレータです。

客観クラスメソッド結合方法

クラスの結合方法に関する特別

メソッドの最初のパラメータとしてのみクラスによって呼び出される装飾するための方法、および方法の意志クラスをクラスメソッド。このメソッドが呼び出され、クラスの結合方法を

(特別には、オブジェクトのバインド方法です)

オブジェクトによって呼び出され、オブジェクトは、メソッドの最初のパラメータとして使用されます。

クラスメソッドの使い方

その上@classmethod必要飾られる関数のように、ノーマルとデコレータ。

staticmethod

何がそれをstaticmethod?

staticmethodデコレータはメソッドがクラスにバインドされていない、対象に結合しないように、内部クラスへのプロセスは、装飾することができます。

なぜstaticmethodを使うのか?

使用して、クラスにバインドされていない、対象に結合しないクラスメソッド内で変更@staticmethod。したがって、この方法は、以下のように呼ばれる非結合方法

staticmethodの使い方

その上@staticmethod必要飾られる関数のように、ノーマルとデコレータ。

でisinstance

でisinstance(パラメータ1、パラメータ2):

python組み込み関数は、次の2つのパラメータ、パラメータ2のインスタンスかどうかを決定するためのパラメータを渡すことができます。図1は、一般的なパラメータオブジェクト・クラスは、パラメータ2です。

class Foo:
    pass

class Goo(Foo):
    pass


foo_obj = Foo()
print(isinstance(foo_obj, Foo))  # True
print(isinstance(foo_obj, Goo))  # False

issubclass

issubclass(パラメータ1、パラメータ2):

Pythonは組み込み関数、二つの機能は、パラメータは、パラメータ1 2つのサブクラスであるかどうかを決定するため、通過することができます。パラメータ1とパラメータ2の両方のクラス。

class Foo:
    pass

class Goo(Foo):
    pass

print(issubclass(Goo, Foo))  # True

反射

反射とは何ですか

これは、オブジェクト・クラスまたは文字列プロパティの操作に反映されます

反射し、使用

リフレクション4つの機能があります。

  1. hasattr:文字列では、文字列は、かどうか、オブジェクトクラスの属性が決定されます。
  2. GETATTR:文字列によってオブジェクトまたはクラスのプロパティを取得します。
  3. SETATTR:文字列またはオブジェクトクラスの設定属性によって。
  4. delattr:文字列、またはオブジェクトクラスの属性を削除することによって。
class People:
    country = 'China'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


p = People('tank', 17, 'male')

# hasatter普通方式
# print(p.__dict__)
# print(People.__dict__)
# hasatter
print(hasattr(p, 'name'))  # True
print(hasattr(People, 'country'))  # True


# getattr普通方式
print(p.__dict__.get('name', 'nick'))  # tank
print(p.__dict__.get('level', 9))  # 9  # 有就取值,没有就添加值
# getattr
print(getattr(p, 'name', 'nick'))  # tank
print(getattr(p, 'salary', 15000))  # 15000 # 有就取值,没有就添加值


# setattr普通方法
p.level = 10
print(p.level)  # 10
# setattr
print(p.__dict__.get('salary'))  # None
print(hasattr(p, 'salary'))  # False
setattr(p, 'salary', 20000)
print(hasattr(p, 'salary'))  # True
print(p.salary)  # 20000


# delattr 普通方法
setattr(p, 'salary', 20000)
print(hasattr(p, 'salary'))  # True
del p.salary
print(hasattr(p, 'salary'))  # False
# delattr
setattr(p, 'salary', 20000)
print(hasattr(p, 'salary'))  # True
delattr(p, 'salary')
print(hasattr(p, 'salary'))  # False

マジックメソッド

「終わりの始まりは、__ __」としても知られている魔法の方法、と呼ばれている方法で、クラス内で定義された方は、「クラスのビルトインメソッド。」一定の条件が満たされたときにマジックメソッドがトリガされます。

あなたはこれらのいずれかの方法の実装(ヘビーデューティー)をオブジェクト場合、このメソッドは例外的な状況のPythonで呼び出されます、あなたが望む動作を定義することができ、そしてこのすべてが自動的に行われます。

マジックメソッド 意味
魔法の基本的な方法
__新着__ __init__実行前にトリガー
__初期化__ トリガー(クラスを呼び出すときに)インスタンスが作成されるコンストラクタ
__del__ オブジェクトが破棄される前に、この方法は、この方法は、最後に実行され、実行されます。
__str__ 定義された印刷方法が行動に呼び出された場合
__getattr__ オブジェクト。プロパティ、「プロパティではない」状況で焼成されます。
__setattr__ それはときにトリガされます「オブジェクト。属性=属性値。」(トリガプロパティを設定しました)
__コール__ 許可クラスのインスタンスは、関数のように呼び出されます。x(a、b)は呼び出し元のx .__コール__(a、b)は

class Foo(object):

    # 在调用之前触发,即在__init__()执行前触发,用来生成一个空的对象
    def __new__(cls, *args, **kwargs):
        print('你在生成一个空的对象')
        # print(cls)
        print(object.__new__(cls))
        return object.__new__(cls)
        # 如果没有return一个空对象,就不会触发__init__()


    # 在调用类时触发
    def __init__(self):
        print('你在调用类')


    # 在打印一个实例化对象时触发
    def __str__(self):
        print('你在打印对象')
        # 必须要有一个返回值,且改返回值必须是字符串
        # 随便打印出来什么,只是显示了而已,和对象其实没什么关系
        # 只是用来说明__str__出发了而已
        return '随便'


    # 在实例化对象即将被回收时触发。
    def __del__(self):
        print('对象即将被回收,且清空对内存的占用')


    # 在试图获取一个不存在的属性时触发
    def __getattr__(self, item):
        print('你在试图获取一个不存在的属性')
        print(item)  # item即为那个不存在的属性的属性名
        # 其实,你在用print方法来打印(对象.属性)时,
        # 虽然这个属性不存在,但是也是可以打印出结果的,
        # 印出的内容即是__getattr__()函数返回的值,
        # 没有返回内容,默认返回None。
        return f'{self}.{item} 属性不存在'  # 你在打印对象
                                          # 随便.x 属性不存在
        # return f'{item} 属性不存在'



    # 在进行设置属性(赋值)操作时触发
    def __setattr__(self, key, value):
        # key为属性的属性名,value为设置属性的属性值
        print('你在设置一个对象的属性')
        print(self.__dict__)
        print('key =',key,'value =',value)
        self.__dict__['key'] = value
        print('设置成功!')
        print(self.__dict__)


    # 在调用 对象 时触发
    def __call__(self, *args, **kwargs):
        print('你在调用一个对象!')



# 即将调用类,触发__new__()
    # 你在生成一个空的对象
    # <class '__main__.Foo'>
    # 你在打印对象
    # 随便
    # 对象即将被回收,且清空对内存的占用


# 此时在调用类,触发__init__()
foo = Foo()  # 你在调用类



# 此时在打印类,啥也没发生,就正常打印类
print(Foo)  # <class '__main__.Foo'>


# 此时在打印对象,触发__str__()
print(Foo())  # 在打印对象时触发
              # 随便
print(foo)  # 在打印对象时触发
            # 随便
            # 如果没有__str__ 就是一个地址:
            # <__main__.Foo object at 0x0000022BA3C38188>


# 此时在试图获取一个不存在的属性,触发__getattr__()
foo.x  # 你在试图获取一个不存在的属性
       # x
print(foo.x)  # 你在试图获取一个不存在的属性
                # x
                # x 属性不存在


# 这里在调用一个对象,触发__call__()
foo()  # 你在调用一个对象!


# 这里在进行设置属性(赋值)操作,触发__setattr__()
foo.x = 10  # 你在设置一个对象的属性
            # key = x value = 10


# 此时实例化对象被回收时,触发__del__()
del foo
print('文件这个时候才运行结束')  # 对象即将被回收,且清空对内存的占用
                             # 文件这个时候才运行结束


'''
你在生成一个空的对象
你在打印对象
随便
对象即将被回收,且清空对内存的占用
你在调用类
<class '__main__.Foo'>
你在生成一个空的对象
你在打印对象
随便
对象即将被回收,且清空对内存的占用
你在调用类
你在打印对象
随便
对象即将被回收,且清空对内存的占用
你在打印对象
随便
你在试图获取一个不存在的属性
x
你在打印对象
你在试图获取一个不存在的属性
x
你在打印对象
随便.x 属性不存在
你在调用一个对象!
你在设置一个对象的属性
{}
key = x value = 10
设置成功!
{'key': 10}
对象即将被回收,且清空对内存的占用
文件这个时候才运行结束
'''

シングルトン

シングルトンが生成されたクラスのコール・オブジェクト・インスタンスを参照すると、単一のインスタンスを指します。

異なるメモリアドレスシングルトンを持って複数のオブジェクトをインスタンス化するメモリアドレスにクラスオブジェクト点発生コールの場合には、すべての発信者を可能にします。

例:ファイルを開きます。

単一の目的の例:メモリ使用量を削減するために。

class File:

    __instance = None

    # 单例方式1:
    @classmethod
    def singleton(cls, file_name):
        if not cls.__instance:
            obj = cls(file_name)
            cls.__instance = obj
        return cls.__instance

    # 单例方式2:
    def __new__(cls, *args, **kwargs):
        # cls.__new__(cls, *args, **kwargs)
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, file_name, mode='r', encoding='utf-8'):
        self.file_name = file_name
        self.mode = mode
        self.encoding = encoding

    def open(self):
        self.f = open(self.file_name, self.mode, encoding=self.encoding)

    def read(self):
        res = self.f.read()
        print(res)

    def close(self):
        self.f.close()


# 方式1:
# obj1 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
# obj2 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
# obj3 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
# obj1 = File('jason雨后的小故事.txt')
# obj2 = File('jason雨后的小故事.txt')
# obj3 = File('jason雨后的小故事.txt')
# print(obj1)
# print(obj2)
# print(obj3)

# 方式2:
obj1 = File('jason雨后的小故事.txt')  # singleton(cls)
obj2 = File('jason雨后的小故事.txt')  # singleton(cls)
obj3 = File('jason雨后的小故事.txt')  # singleton(cls)
print(obj1)
print(obj2)
print(obj3)

おすすめ

転載: www.cnblogs.com/bowendown/p/11668986.html