オブジェクト指向の方法及び機能、反射、方法ビスパイソン

まず、関数とメソッド

1.機能と方法の違い

機能:すべての支配的な質量参加、手動変速機パラメータにかかわらず、被験者の

方法:隠された大量の参加の有無、および関連オブジェクト

1.1は、関数名によって判断することができます

len()就是函数
str.count()就是方法

def func():
    pass
class A:
    def func(self):

print(func)
obj = A()
print(obj.func()) 

タイプモジュール2.2を決定すること

from types import functionType
from types import MethodType
print(isinstance(func,FunctionType))
print(isinstance(func,MethodType))
  • クラス名は、関数呼び出しFUNCです
  • オブジェクトは、メソッドfuncを呼び出すことです

静的メソッド2.3研究

print(isinstance(A.f, FunctionType)) #指的是函数类型
print(isinstance(A.f, MethodType)) #类方法

第二に、反射

用途は何ですか

そこには、変数を知っていた時間です文字列データは、名前を入力あなたがそれを呼びたいが、しかしチューン未満、あなたはリフレクションを使用することができます

反射法

でオブジェクトを操作するための文字列

getattr 获取一个属性或者方法
getattr(obj,'name1',None) #前面是类名,后面是字符串形式的属性或方法

hasattr 判断属性或方法是否存在  
hasattr(obj,'name')

setattr 设置新的属性
setattr(obj,'hobby', '玩')

hasattr 删除属性
hasattr(obj, 'func')

オブジェクトのインスタンス化を反映

文字列の形式でオブジェクトインスタンスのプロパティに続く、名前の前にオブジェクトをインスタンス化します

class Foo:
    f = '类的静态变量'

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

    def say_hi(self):
        print(f'hi,{self.name}')

obj = Foo('egon', 73)

# 检测是否含有某属性 name
print(hasattr(obj, 'name'))
print(hasattr(obj, 'say_hi'))

# 获取属性
n = getattr(obj, 'name')  # 等同于 obj.name
print(n)
func = getattr(obj, 'say_hi')
func()

# print(getattr(obj, 'aaaaaaaa', '不存在啊'))  # 报错

# 设置属性
setattr(obj, 'sb', True)  # 等同于 obj.sb = True
setattr(obj, 'show_name', lambda self: self.name + 'sb')
print(obj.__dict__)
print(obj.show_name(obj))

# 删除属性
delattr(obj, 'age')  # 等同于 del obj.age
delattr(obj, 'show_name')
# delattr(obj, 'show_name111')  # 不存在,则报错

print(obj.__dict__)

クラスのリフレクション

クラス名の前には、プロパティやメソッドは、クラスの文字列が続きます

class Foo(object):
    staticField = "old boy"

    def __init__(self):
        self.name = 'wupeiqi'

    def func(self):
        return 'func'

    @staticmethod
    def bar():
        return 'bar'

print(getattr(Foo, 'staticField')) # 前面是类名,后面是类的属性或方法
print(getattr(Foo, 'func'))
print(getattr(Foo, 'bar'))

反射し、現在のモジュール

import sys

def s1():
    print('s1')

def s2():
    print('s2')

this_module = sys.modules[__name__]  # 比较推荐#sys.modules 获得到的是 当前文件的所有属性及方法,返回是一个字典
# 等同于 this.module = sys.modules["__main__"]

hasattr(this_module, 's1')
getattr(this_module, 's2')()

他のモジュールを反映

"""
程序目录:
    module_test.py
    index.py
"""

#  module_test.py   中的代码
def test():
    print('from the test')

# index.py   中的代码
import module_test as obj

# obj.test()

print(hasattr(obj, 'test'))

getattr(obj, 'test')()
class A:

    static_field = '静态属性'

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

    def func(self):
        print('in A func')


obj = A('MC骚Q', 18)
print(obj.name)
#
print(hasattr(obj,'name'))  # ***
print(getattr(obj,'name1',None))  ***
setattr(obj,'hobby', '玩') *
print(getattr(obj,'hobby'))
print(obj.hobby)
delattr(obj,'name') *
print(hasattr(obj,'name'))
if hasattr(obj, 'static_field'):
    print(getattr(obj,'static_field'))

if hasattr(obj, 'func'):
    # print(getattr(obj,'func'))
    getattr(obj,'func')()

第三に、ビスの方法

__len__

使用

属性の数は、次のような、クラスを取得することができます__init__

フォーマット

def __len(self):
    print('触发__len__方法')
    return 10

トリガー方法

len(obj)

オブジェクトがlen()関数を使用することができますなぜ、根本的な原因は、あなたが入力から持っているオブジェクトクラスである理由__len__メソッド、メソッドが実際に実行される** lenの)クラスがlenを(使用して、この方法を__len__されていない場合は、エラーがスローされます**

__hash__

使用

ハッシュ

トリガー方法

print(hash(obj))

__str__方法

使用

プリント出力

トリガー方法

print(obj)

__repr__方法

使用

同じ__str__STR、STR優先度の高い同時がある場合など

トリガー方法

print(此对象是%r那就先执行repr的方法)

__call__方法

トリガー方法

obj() #对象加括号触发就会触发类里面的__call__方法

__eq__方法

使用

あなたは二つのオブジェクトのクラスである運転を比較すると、それが引き金となる__eq__方法を

__del方法

用途は何ですか

ゼロ時間のためのオブジェクト参照は、デストラクタは、自動的に削除します

メモリから削除し、ガベージコレクションメカニズム♻️

メソッドを呼び出します

l2 = [1,2,3]
dic = {1:22, 2:33}
del l2
del dic #主动删除

__new__(*****************)

どのような使用

  • オブジェクトを構築します(自動的に実行__init__ファイルがあるときに__new__、乾燥この事の子供たちに)
  • 構築し、新たなスペースを返すの作成
class A(object):

    def __init__(self):
        print('in __init__')
    def __new__(cls, *args, **kwargs):
        print('in __new__')
        object1 = object.__new__(cls)
        return object1
obj = A()
# 输出结果
in __new__
in __init__

シングルトン

シングルトンパターンSingletonパターンを使用すると、目的はスペースを節約するために、1つのオブジェクトであるだけであるメモリをインスタンス化した回数に関係なく、デザインパターン、クラスのインテリジェントインスタンス化オブジェクト、ではありません

インタビューほとんど常にあなたがシングルトンを手ましょう

class A:
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            object1 = object.__new__(cls) 
            cls.__instance = object1
        return cls.__instance
obj = A()
obj1 = A()
obj2 = A()
obj3 = A()
print(obj, obj1, obj2, obj3)

__item__方法

使用

辞書などのオブジェクトを操作します

__getitem__、__setitem__、__delitem__、

class Foo:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):
        print(item)
        print('get时 执行我')

    def __setitem__(self, key, value):
        self.name = value
        print('set时执行我')

    def __delitem__(self, key):
        print(f'del obj{[key]}时,我执行')

obj = Foo('御姐')
# obj.__dict__
# obj['name']
# obj['name'] = '萝莉'
# print(obj.name)
del obj['name']

class Foo:
    def __init__(self, name, key, value):
        self.name = name

        self.dict = {}
        self.dict[key] = value

    def __getitem__(self, key):
        print("1313", self.dict[key])
        # return self.dict[key]

    def __setitem__(self, key, value):
        self.__dict__[key] = value
        print(key, "创建新的键值对")

    def __delitem__(self, key):
        print('del obj[', key, ']时,我执行')
        self.__dict__.pop(key)

    def __delattr__(self, item):
        print('del obj.', item, '时,我执行')
        self.__dict__.pop(item)

f1 = Foo("sb", "A", "1")
f1["A"]  # 会去执行  __getitem__ 方法
f1['age'] = 18  # 会去执行  __setitem__ 方法
f1['age'] = 112  # 修改也会去执行 __setitem__ 方法
f1['age1'] = 250  # 修改也会去执行 __setitem__ 方法
del f1.age1  # 会去执行  __delattr__ 方法
del f1['age']  # 会去执行  __delitem__ 方法
f1['name'] = 'alex'  # 会去执行  __setitem__ 方法
print(f1.__dict__)


クラスメソッドを使用して認証***

class Auth:

    function_list = [('login','请登录'),('register','请注册'),('exit_q','退出')]

    def login(self):
        print('欢迎登录')

    def register(self):
        print('欢迎注册')

    def exit_q(self):
        print('退出程序')
        exit()

while 1:
    obj = Auth()
    for num,option in enumerate(obj.function_list,1):
        print(num,option[1])

    try:
        choice_num = input('请输入选择: ').strip()
        if hasattr(obj,obj.function_list[int(choice_num)-1][0]):
            getattr(obj,obj.function_list[int(choice_num)-1][0])()
    except IndexError:
        print('请输入超过范围')
    except ValueError:
        print('请输入数字')

おすすめ

転載: www.cnblogs.com/zanao/p/11227589.html