day44 5 物件導向高階

2021-10-24 08:59:23 字數 4661 閱讀 5030

class

car:

pass

class

foo():

def__new__

(cls,

*args,

**kwargs)

: obj=car(

)return obj

def__init__

(self, name)

: self.name = name

print

('我是init'

)f=foo(

'lqz'

)print

(f.name)

class

foo:

def__init__

(self, name)

: self.name = name

def__getattr__

(self, item)

:print

(item)

return

99def

__setattr__

(self, key, value)

:if key ==

'age':if

isinstance

(value,

int)

:# 往物件中放屬性,反射

# setattr(self,key,value) # setattr本質還是呼叫了self.key=value

# self.age = value # 這兩種方式都不可以

# 可以使用的方式

# self.__dict__[key] = value # 這種方式解決遞迴問題

# 普通函式,有幾個引數,就傳幾個引數

object

.__setattr__(self,key,value)

else

:raise exception(

'不讓放'

)def

printsize

(self)

:print

(self.__size)

f = foo(

'lqz'

)print

(f.__dict__)

print

(f.name)

f.age =

'19'

# 放的age必須是數字

f.age =

19# 放的age必須是數字

print

(f.age)

object

.__setattr__(f,

'_foo__size'

,178

)# print(f.size)

f.printsize(

)print

(f._foo__size)

print

(f.name)

# print(f.***)

# print(f.xx)

class

foo:

def__init__

(self, name)

: self.name = name

def__getattr__

(self, item)

:# print(item)

return

99 f=foo(

'lqz'

)print

(f.name)

# 屬性不在物件中,才觸發

f.age=

100print

(f.age)

# 不繼承字典,還支援賦值取值

class

foo:

def__setitem__

(self, key, value)

:setattr

(self, key, value)

# object.__setattr__(self,key,value)

def__getitem__

(self, item)

:return

getattr

(self, item)

f = foo(

)f.name =

'lqz'

print

(f.name)

print

(f['name'])

f['age']=

19print

(f.age)

print

(f['age'

])

classa:

__slots__ =

['name'

,'age'

]a1 = a(

)# print(a1.__dict__) # attributeerror: 'a' object has no attribute '__dict__'

a1.name =

'張三'

a1.age =

24print

(a1.age)

# a1.hobby = '泡妞' # attributeerror: 'a' object has no attribute 'hobby'

a1.size=

179print

(a1.__slots__)

__call__

class

foo():

def__call__

(self,

*args,

**kwargs)

:print

('我被執行了'

)# foo() 會觸發元類的 __call__方法

f = foo()f(

)classa:

"""我是a類的描述資訊啊手動閥手動閥"""

pass

print

(a.__doc__)

classa:

def__enter__

(self)

:print

('進入with語句塊時執行此方法,此方法如果有返回值會賦值給as宣告的變數'

)return

'oo'

def__exit__

(self, exc_type, exc_val, exc_tb)

:print

('退出with**塊時執行此方法'

)print

('1'

, exc_type)

print

('2'

, exc_val)

print

('3'

, exc_tb)

with a(

)as f:

print

(f)print

('嘿嘿嘿'

)len([

1,2,

3])len

('ssss'

)classa:

def__init__

(self)

: self.x =

1 self.y =

2 self.z =

3def

__len__

(self)

:return

len(self.__dict__)

a = a(

)print

(len

(a))

classa:

def__init__

(self)

: self.x =

1 self.y =

2 self.z =

3def

__hash__

(self)

:return

hash

(str

(self.x)

+str

(self.x)

)a = a(

)# print(hash('sdfasdfasdf'))

# print(hash([1,2,3]))

print

(hash

(a))

python的函式傳參是值傳遞還是引用傳遞?

什麼是值,什麼是引用(位址)?一切皆物件,一切都是位址(python中壓根就沒有值型別)

可變型別和不可變型別

# 物件 == 比較時觸發執行

classa:

def__init__

(self,x,y)

: self.x = x

self.y = y

def__eq__

(self,obj)

:# 列印出比較的第二個物件的x值

print

(obj.x)

if self.x +self.y == obj.x+obj.y:

return

true

else

:return

false

a = a(1,

2)b = a(2,

2)print

(a == b)

type 類,繼承object,是所有類的類,包括自己

object類:誰都沒繼承,它是由type例項化得到的,是所有類的父類,包括type

day21 物件導向高階

多型指的是一類事物有多種形態,比如動物有多種形態 貓 狗 豬 class animal 同一類事物 動物 def talk self pass class cat animal 動物的形態之一 貓 def talk self print 喵喵喵 class dog animal 動物的形態之二 狗 ...

物件導向 高階

json方式的物件導向 json 把方法包在json裡 json物件導向 有人管他叫 命名空間 在公司裡 把同一類 的方法包在一起 拖拽和繼承 物件導向的拖拽 改寫原有的拖拽 繼承 asdf 拖拽 instanceof 檢視物件是某個類的例項 使用繼承 限制範圍的拖拽類 建構函式的偽裝 屬性的繼承 ...

物件導向高階

public class person public void print public class student extends person 重寫了父類方法 public void print public class demo public class demo 1.不能new這個類,只能靠...