在类的内部,有变量和方法,这些变量和方法可以在类的外部通过实例或者类名进行调用,例如:
class Father():
s1 = '这是父类的第一个变量'
s2 = '这是父类的第二个变量'
@classmethod
def cls_mythod(cls):
print('我是类的方法')
def oth_mythod(self):
print("这是oth_mythod函数")
i = int(input("请输入oth_mythod的第一个参数:\n"))
j = int(input("请输入oth_mythod的第二个参数:\n"))
m =i*j
print(m)
Father.cls_mythod()
father = Father()
father.oth_mythod()
print("通过父类对象访问第一个父类的变量")
father.s1
结果是:
D:\*************************************************\3.py
我是类的方法
这是oth_mythod函数
请输入oth_mythod的第一个参数:
2
请输入oth_mythod的第二个参数:
3
6
通过父类对象访问第一个父类的变量
Process finished with exit code 0
通过对象可以很轻松的访问对象所属类的成员变量
但是有时候希望能够保护其中变量和方法不能被外部访问,针对地保护某些成员,限制对这些成员的访问。
如果想要内部成员不被外部访问,需要在成员的名字前加上两个下划线’__',这样成员就变成了私有成员(private)。私有成员只能够在类的内部进行访问,外部无法访问如:
还是上一个程序,在s2面前加上__使这个变量变成私有变量,如果这个时候通过实例或者类调用,结果如下:
__s2 = '这是父类的第二个变量'
运行后:
Traceback (most recent call last):
File "D:\*************************\3.py", line 18, in <module>
father.s2
AttributeError: 'Father' object has no attribute 's2'. Did you mean: 's1'?
在外部找不到类的私有变量,换成类名也一样
注意:
前面带有__不一定都是私有成员,还有可能使特殊变量或者方法如:__init
&
&
&
反射:reflect
使用一个函数:getattr(),注意这个函数需要传递两个参数,第一个模块的名称,第二个使模块的方法名字或者模块里面的参数在使用得到的方法时,要在gettattr(模块名,方法名)加上()
而hasattr(模块名,方法名),会去当前模块进行寻找当前的方法如果找到返回ture否则返回 false,并不会终止程序。