通過字串的形式操作物件相關的屬性
四個可以實現自省的函式:hasattr、getattr、setattr、delattr
class
people:
country = 'china'
def__init__
(self,name):
self.name = name
p = people('spring')
print(p.__dict__)
print(hasattr(p,'country'))
print(hasattr(p,'__doc__'))
print(hasattr(p,'name'))
print(hasattr(p,'__init__'))
print(hasattr(people,'country'))
res = getattr(p,'country')
print(res)
res = getattr(p, 'age', '沒有設定age')
print(res)
res = getattr(people, 'country')
print(res)
p.age = 18
print(p.age)
print(p.__dict__)
setattr(p, 'age', 28)
print(getattr(p, 'age'))
setattr(people,'country','usa')
print(getattr(people,'country'))
print(hasattr(p, 'age'))
delattr(p, 'age') #res = getattr(p, 'age', '沒有設定age') # 找不到可以設個返回值,不設定找不到會報錯。
print(hasattr(p, 'age'))
#不推薦這個
m = __import__('time')
print(m.time())
#推薦方法
import importlib
m = importlib.import_module('time')
print(m.time())
#module
class
ftpclient:
def__init__
(self, addr):
print('正在連線伺服器[%s]'%addr)
self.addr = addr
# def get(self):
# print('get')
from module import ftpclient
f1 = ftpclient('192.168.1.1')
if hasattr(f1, 'get'):
func_get = getattr(f1, 'get')
func_get()
else:
print('---->不存在此方法')
import sys
x = 22
class
foo:
pass
defs1
(): print('s1')
defs2
(): print('s2')
this_module = sys.modules[__name__]
print(this_module)
print(hasattr(this_module,'s1'))
print(this_module.s1)
#__setattr__, __delattr__, __getattr__
class
foo:
def__init__
(self,name):
self.name = name
def__setattr__
(self, key, value):
print('---setattr-----key: %s value: %s'%(key, value))
self.__dict__[key] = value
def__delattr__
(self, item):
print('------delattr-----item: %s'%item)
# self.__dict__.pop(item)
del self.__dict__[item]
def__getattr__
(self, item):
print('----getattr----item: %s'%item)
#setattr
cc = foo('spring')
print(cc.__dict__)
print(cc.name)
cc.__dict__['age'] = 166
print(cc.age)
#delattr
print(cc.__dict__)
del cc.age
print(cc.__dict__)
#getattr 屬性不存在才會執行 和getattr() 結合使用
print('!'*100)
print(cc.zz)
class
list
(list):
def(self, object: int):
ifnot isinstance(object,int):
raise typeerror('must be int')
definsert
(self, index: int, object: int):
ifnot isinstance(object, int):
raise typeerror('must be int')
super().insert(index, object)
cc = list([1,2,3])
print(cc)
print(cc)
cc.insert(0,22)
print(cc)
import time
class
open:
def__init__
(self, file_path, m='r', encode='utf-8'):
self.x = open(file_path, mode=m, encoding=encode)
self.file_path = file_path
self.encoding = encode
defwrite
(self, line):
print('寫入: ', line)
t = time.strftime('%y-%m-%d %x')
self.x.write('%s %s'%(t, line))
def__getattr__
(self, item):
return getattr(self.x, item)
f = open('a.txt', m='a+')
f.x.write('sss\n')
f.write('zzz\n')
f.seek(0)
print(f.read())
class
list:
def__str__
(self):
return str(self.cont)
def__init__
(self,cont):
self.cont = cont
def(self,value):
ifnot isinstance(value, str):
raise typeerror('must be str')
@property
defmid
(self):
if len(self.cont) == 1
or len(self.cont) == 0: #如果list為**著只有乙個元素返回list本身
return self.cont
a, b = divmod(len(self.cont), 2)
if b != 0:
return self.cont[a+1] #如果奇數返回中間數
else:
return self.cont[a:a+2] #如果是偶數返回中間的2個數
def__getattr__
(self, item):
#其餘方法都使用list自帶
return getattr(self.cont,item)
cc = list(['b','a','c','d'])
print(cc.mid)
cc.sort()
print(cc)
物件導向 高階
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這個類,只能靠...
物件導向高階
私有屬性,不能被子類繼承,在屬性的前面加上 就變為了私有屬性 私有方法,不能被子類繼承,在方法的前面加上 就變為了私有方法 只在前面加,後面不加,一般前後都有 的,屬於類當中自帶的方法或屬性 class class test1 str1 a 私有屬性 def init self pass def m...