2.1.2 Python 객체에 대한 반사 및 내장 방법
목록 읽기
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클래스가 슈퍼클래스의 파생클래스인지 확인
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar, Foo)
2, 반사
==1 반사란 무엇인가==반사라는 개념은 1982년에 Smith가 처음으로 제기한 것으로 주로 프로그램이 그 자체의 상태나 행위를 방문, 검측, 수정할 수 있는 능력(자성)을 가리킨다.이 개념의 제기는 곧 컴퓨터 과학 분야의 응용 반사성에 대한 연구를 불러일으켰다.프로그램 언어의 디자인 분야에서 먼저 사용되었고Lisp와 대상을 대상으로 하는 분야에서 성과를 거두었다.2python은 대상에 대한 반사: = 문자열의 형식으로 대상과 관련된 속성을 조작합니다.python의 모든 사물은 대상(반사 사용 가능) 네 가지 자성할 수 있는 함수
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
네 가지 방법의 사용 시범
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
대상이 메모리에서 방출될 때 자동으로 실행됩니다.
주: 이 방법은 일반적으로 정의할 필요가 없습니다. 파이톤은 고급 언어이기 때문에 프로그래머가 사용할 때 메모리의 분배와 방출에 관심을 가질 필요가 없습니다. 이 작업은 모두 파이톤 해석기에 맡기기 때문에 분석 함수의 호출은 해석기가 쓰레기 회수를 할 때 자동으로 터치하여 실행합니다. ==간단한 시범==
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__
대상 뒤에 괄호를 붙여서 실행을 촉발합니다.주: 구조 방법의 집행은 창설 대상에 의해 촉발된다. 즉, 대상 = 클래스 이름().콜 방법의 실행은 대상 뒤에 괄호를 붙여서 촉발한다. 즉, 대상 () 또는 클래스 () ()
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))
카드 게임
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))
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.