2.1.2 Pythonのオブジェクトへの反射および組み込み方法
9209 ワード
クリックしてノートの総目次を回転します
setattr delattr getattr hasattr
__getitem__ __setitem__ __delitem__
isinstance(obj,cls)objがクラスclsのオブジェクトかどうかをチェック
issubclass(sub,super)subクラスがsuperクラスの派生クラスであるかどうかをチェック
==1反射とは何か==反射の概念は1982年にSmithが初めて提案したもので、主にプログラムが自身の状態や行為にアクセス、検出、修正できる能力(自省)を指す.この概念の提出はすぐにコンピュータ科学分野の応用反射性に関する研究を引き起こした.それはまずプログラム言語の設計分野に採用され,Lispとオブジェクト向けの面で成績を収めた.==2 pythonオブジェクトへの反射:==オブジェクト関連のプロパティを文字列で操作します.pythonのすべてのものはオブジェクト(反射を使用することができます)4つの自省可能な関数です.以下の方法はクラスとオブジェクト(すべてオブジェクト、クラス自体もオブジェクト)hasattrに適用されます.
getattr
setattr
delattr
4つの方法の使用方法のデモ
オブジェクトの文字列表示strを変更します.repr__ カスタムフォーマット文字列format
%sと%r
オブジェクトがメモリから解放されると、自動的に実行がトリガーされます.
注意:この方法は一般的に定義する必要はありません.Pythonは高度な言語であり、プログラマは使用時にメモリの割り当てと解放に関心を持つ必要はありません.この作業はPython解釈器に任せて実行されるため、構造関数の呼び出しは解釈器がゴミ回収を行うときに自動的にトリガーされます.==単純モデル==
__getitem__ __setitem__ __delitem__
単一モード
オブジェクトの後ろにかっこを付け、実行をトリガーします.注意:構築メソッドの実行は、オブジェクトの作成によってトリガーされます.すなわち、オブジェクト=クラス名()です.一方、callメソッドの実行は、オブジェクト()またはクラス()()()であるオブジェクトの後かっこでトリガーされます.
トランプゲーム
カードゲーム2
一つの面接問題
目次を読む
1,isinstanceとissubclass
2、反射
3,__str__およびrepr
4,__del__
5,itemシリーズ
6,__new__
7,__call__
8,__len__
9,__hash__
10,__eq__
1,isinstanceとissubclass
isinstance(obj,cls)objがクラスclsのオブジェクトかどうかをチェック
class Foo(object):
pass
obj = Foo()
isinstance(obj, Foo)
issubclass(sub,super)subクラスがsuperクラスの派生クラスであるかどうかをチェック
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar, Foo)
2、反射
==1反射とは何か==反射の概念は1982年にSmithが初めて提案したもので、主にプログラムが自身の状態や行為にアクセス、検出、修正できる能力(自省)を指す.この概念の提出はすぐにコンピュータ科学分野の応用反射性に関する研究を引き起こした.それはまずプログラム言語の設計分野に採用され,Lispとオブジェクト向けの面で成績を収めた.==2 pythonオブジェクトへの反射:==オブジェクト関連のプロパティを文字列で操作します.pythonのすべてのものはオブジェクト(反射を使用することができます)4つの自省可能な関数です.以下の方法はクラスとオブジェクト(すべてオブジェクト、クラス自体もオブジェクト)hasattrに適用されます.
def hasattr(*args, **kwargs): ## real signature unknown
"""
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
"""
pass
getattr
def getattr(object, name, default=None): ## known special case of getattr
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass
setattr
def setattr(x, y, v): ## real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass
delattr
def delattr(x, y): ## real signature unknown; restored from __doc__
"""
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''
"""
pass
4つの方法の使用方法のデモ
class Foo:
f = ' '
def __init__(self,name,age):
self.name=name
self.age=age
def say_hi(self):
print('hi,%s'%self.name)
obj=Foo('egon',73)
#
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))
#
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()
print(getattr(obj,'aaaaaaaa',' ')) #
#
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))
#
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')# ,
print(obj.__dict__)
3,strとrepr
オブジェクトの文字列表示strを変更します.repr__ カスタムフォーマット文字列format
#_*_coding:utf-8_*_
format_dict={
'nat':'{obj.name}-{obj.addr}-{obj.type}',# - -
'tna':'{obj.type}:{obj.name}:{obj.addr}',# : :
'tan':'{obj.type}/{obj.addr}/{obj.name}',# / /
}
class School:
def __init__(self,name,addr,type):
self.name=name
self.addr=addr
self.type=type
def __repr__(self):
return 'School(%s,%s)' %(self.name,self.addr)
def __str__(self):
return '(%s,%s)' %(self.name,self.addr)
def __format__(self, format_spec):
## if format_spec
if not format_spec or format_spec not in format_dict:
format_spec='nat'
fmt=format_dict[format_spec]
return fmt.format(obj=self)
s1=School('oldboy1',' ',' ')
print('from repr: ',repr(s1))
print('from str: ',str(s1))
print(s1)
'''
str print --->obj.__str__()
repr --->obj.__repr__()
__str__ , __repr__
: ,
'''
print(format(s1,'nat'))
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))
%sと%r
class B:
def __str__(self):
return 'str : class B'
def __repr__(self):
return 'repr : class B'
b=B()
print('%s'%b)
print('%r'%b)
4,del
オブジェクトがメモリから解放されると、自動的に実行がトリガーされます.
注意:この方法は一般的に定義する必要はありません.Pythonは高度な言語であり、プログラマは使用時にメモリの割り当てと解放に関心を持つ必要はありません.この作業はPython解釈器に任せて実行されるため、構造関数の呼び出しは解釈器がゴミ回収を行うときに自動的にトリガーされます.==単純モデル==
class Foo:
def __del__(self):
print(' ')
f1=Foo()
del f1
print('------->')
#
------->
5,itemシリーズ
__getitem__ __setitem__ __delitem__
class Foo:
def __init__(self,name):
self.name=name
def __getitem__(self, item):
print(self.__dict__[item])
def __setitem__(self, key, value):
self.__dict__[key]=value
def __delitem__(self, key):
print('del obj[key] , ')
self.__dict__.pop(key)
def __delattr__(self, item):
print('del obj.key , ')
self.__dict__.pop(item)
f1=Foo('sb')
f1['age']=18
f1['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)
6,__new__
class A:
def __init__(self):
self.x = 1
print('in init function')
def __new__(cls, *args, **kwargs):
print('in new function')
return object.__new__(A, *args, **kwargs)
a = A()
print(a.x)
単一モード
class Singleton:
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
cls._instance = object.__new__(cls, *args, **kw)
return cls._instance
one = Singleton()
two = Singleton()
two.a = 3
print(one.a)
## 3
## one two , id(), ==, is
print(id(one))
## 29097904
print(id(two))
## 29097904
print(one == two)
## True
print(one is two)
7,__call__
オブジェクトの後ろにかっこを付け、実行をトリガーします.注意:構築メソッドの実行は、オブジェクトの作成によってトリガーされます.すなわち、オブジェクト=クラス名()です.一方、callメソッドの実行は、オブジェクト()またはクラス()()()であるオブジェクトの後かっこでトリガーされます.
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() ## __init__
obj() ## __call__
8,__len__
class A:
def __init__(self):
self.a = 1
self.b = 2
def __len__(self):
return len(self.__dict__)
a = A()
print(len(a))
9,__hash__
class A:
def __init__(self):
self.a = 1
self.b = 2
def __hash__(self):
return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
10,__eq__
class A:
def __init__(self):
self.a = 1
self.b = 2
def __eq__(self,obj):
if self.a == obj.a and self.b == obj.b:
return True
a = A()
b = A()
print(a == b)
トランプゲーム
class FranchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = [' ',' ',' ',' ']
def __init__(self):
self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
for suit in FranchDeck.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self, item):
return self._cards[item]
deck = FranchDeck()
print(deck[0])
from random import choice
print(choice(deck))
print(choice(deck))
カードゲーム2
class FranchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = [' ',' ',' ',' ']
def __init__(self):
self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
for suit in FranchDeck.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self, item):
return self._cards[item]
def __setitem__(self, key, value):
self._cards[key] = value
deck = FranchDeck()
print(deck[0])
from random import choice
print(choice(deck))
print(choice(deck))
from random import shuffle
shuffle(deck)
print(deck[:5])
一つの面接問題
class Person:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
def __eq__(self, other):
if self.name == other.name and self.sex == other.sex:return True
p_lst = []
for i in range(84):
p_lst.append(Person('egon',i,'male'))
print(p_lst)
print(set(p_lst))