新式類都有乙個
__new__
的靜態方法,它的原型是object.__new__(cls[, ...])
cls
是乙個類物件,當呼叫c(*args, **kargs)
來建立乙個類c的例項時,python的內部呼叫是 :
c.__new__(c, *args, **kargs)
然後返回值是類c的例項c
確認c是c的例項後
python再呼叫c.__init__(c, *args, **kargs)
來初始化例項c
所以呼叫乙個例項c = c(2)
,實際執行的**為:
c = c.__new__(c, 2)
if isinstance(c, c):
c.__init__(c, 23)#__init__第乙個引數要為例項物件
object.__new__()
建立的是乙個新的,沒有經過初始化的例項。當重寫__new__
方法時,可以不用使用裝飾符@staticmethod
指明它是靜態函式,直譯器會自動判斷這個方法為靜態方法。如果需要重新繫結c.__new__
方法時,只要在類外面執行c.__new__ = staticmethod(yourfunc)
就可以了。
此外,如果(新式)類中沒有重寫__new__()
方法,即在定義新式類時沒有重新定義__new__()
時,python預設是呼叫該類的直接父類的__new__()
方法來構造該類的例項,如果該類的父類也沒有重寫__new__()
,那麼將一直按此規矩追溯至object的__new__()
方法,因為object是所有新式類的基類。
如果__new__()
沒有返回cls(即當前類)的例項,那麼當前類的__init__()
方法是不會被呼叫的。如果__new__()
返回其他類(新式類或經典類均可)的例項,那麼只會呼叫被返回的那個類的構造方法。
class
c(object):
def__new__
(cls,*args,**kwargs):
print(cls)
print(args)
print(kwargs)
#這裡並沒有返回乙個instance,所以__init__不會被呼叫
def__init__
(self,a,b):
print('__init__ called')
print('self is', self)
self.a=a
self.b=b
a=c(1,2)
執行的結果是:
(1, 2)
{}
class
c(object):
def__new__
(cls,*args,**kwargs):
print(cls)
print(args)
print(kwargs)
new_instance = object.__new__(cls)
return new_instance
#返回乙個instance,之後__init__被呼叫
def__init__
(self,a,b):
print('__init__ called')
print('self is', self)
self.a=a
self.b=b
a=c(1,2)
執行的結果是:
(1, 2)
{}__init__ called
self is <__main__.c object
at 0x7fef84b0a438>
print(someobj)會呼叫someobj.str(), 如果str沒有定義,則會呼叫someobj.repr().
>>>
class
point:
...
def__init__
(self, x, y):
... self.x, self.y = x, y
...
def__repr__
(self):
...
return
'point(x=%s, y=%s)' % (self.x, self.y)
>>> p = point(1, 2)
>>> p
point(x=1, y=2)
class
c:def
__init__
(self):
self.classattr = 'attr on class'
def__repr__
(self):
print('call __repr__')
return self.classattr
def__str__
(self):
print('call __str__')
return self.classattr
cobj = c()
cobj.instattr = "attr on instance"
cobj
# call __repr__
# attr on class
print(cobj)
# call __str__
# attr on class
repr(cobj)
# call __repr__
# attr on class
js內建物件 Object
js中的一些內建方法還是挺好用的,使用它們有時候會節省我們很多時間,還有減少 量 一 object.keys obj 獲取乙個物件的key值,但是引數obj必須是可列舉的物件,他會返回乙個包含物件自身的所有可列舉屬性值的陣列。let obj abc 123 let keys object.keys ...
python內建函式 python的內建函式 方法
1 input 輸入內容時要將內容用引號引起來 input 請輸入密碼 input 請輸入登入名 name input 請輸入姓名 print hello,name 請輸入姓名 binla hello,binla 在列表後邊追加乙個元素 3 extend 在列表之後追加乙個列表 4 insert 位...
python內建類 Python 類的內建方法
usr bin env python coding utf 8 python內建方法 class a n a def f2 self print from a class b a n b def f1 self print from b def f2 self print f2 from b cla...