模块就是py文件, 模块导入就是执行文件
import module_name from package import module_name
广义的封装: 把变量和函数都放在类中
狭义的封装: 把变量和方法隐藏起来, 不对外公开, 只在内部引用
class Foo: # 公有变量 a = 'aa' # 私有变量 __b = 'bb' # 私有变量只允许这样调用 def show(self): print(self.__b) x = Foo() x.__b # --> 报错 x.show() # --> 'bb' ''' 私有变量实际上是把变量__b转换为了_Foo__b, 所以实际调用是x._Foo__b, 通常不这么使用 '''
- 坑
class Foo: def __init__(self): self.__func() def __func(self): print('in Foo') class Son(Foo): def __func(self): print('in Son') s = Son() ''' 1. 调用Son类中__init__方法进行实例化 2. Son中没有__init__方法, 向上寻找, 并将s作为参数传给Foo, 在Foo类中需要__init__方法进行实例化 3. 执行Foo类中的__init__方法, 因为__func是Foo的私有属性, 所以__func()实际为_Foo__func() 4. s._Foo_func()在Son类中没有, 执行Foo类中的_Foo_func() 5. 获得结果in Foo '''
通过字符床类型的变量名访问变量的值
只要是x.y格式的都可以用反射
通常和hasattr何用, hasattr用来验证反射是否存在, 用于容错
class Foo: x = 1 # 类.静态属性 print(Foo.x) # 反射 if hasattr(Foo, 'x') getattr(Foo, 'x')
class Foo: def __init__(self, name): self.name = name egon = Foo('egon') # 对象.静态属性 print(egon.name) # 反射 if hasattr(egon, 'name'): getattr(egon, 'name')
'''文件a''' # 定义s1方法 def s1(): print('s1)
'''文件 b''' # 导入a模块 import a # 反射 if hasattr(a, 's1') getattr(a, 's1')() # --> s1
import sys def s1(): print('s1') def s2(x): print('%s' % x) # 想使用自己模块内的方法或进行实例化需要或许自己模块的名字 my_Module_Name = sys.modules[__name__] getattr(my_Module_Name, 's1')() # --> s1 getattr(my_Module_Name, 's2')('this is s2') # --> this is s2
setattr(obj, str, value)
class Foo: def __init__(self): self.x = 1 f = Foo() if hasattr(f,'x'): print(getattr(f,'x')) setattr(f, 'y', 2) print(f.__dict__) # --> {'x': 1, 'y': 2}
delattr(obj, str)
class Foo: def __init__(self): self.x = 1 self.y = 2 f = Foo() if hasattr(f,'x'): delattr(f, 'y') print(f.__dict__) # --> {'x': 1}
json
pickle
在类中,. 方法一般都是动作
在面向对象的思想里, 属性是静态的, 方法是动态的
Class Circle: def __init__(self, r): self.r = r @property def s(self): return 3.14 * self.r **2 def d(self): return 3.14 * self.r * 2 c = Circle(1) print(c.s) # --> 3.14 print(c.d()) # --> 6.28
文章来源: python学习笔记_day07