第三种是方法的封装(私有化)
import hashlib class User: def __init__(self,name,passwd): self.user = name self.__pwd = passwd # 私有的实例变量 def __get_md5(self): # 私有的方法 md5 = hashlib.md5(self.user.encode(\'utf-8\')) md5.update(self.__pwd.encode(\'utf-8\')) return md5.hexdigest() def getpwd(self): return self.__get_md5() user = User(\'alex\',\'123456\') # user.get_md5() # 这个方法变成私有的了,所以这里是调用不到的。外部值调用不到的,只能在内部调用 # user.__get_md5() # AttributeError: \'User\' object has no attribute \'get_md5\' pwd = user.getpwd() print(pwd) # 94e4ccf5e2749b0bfe0428603738c0f9总结:所有的私有化都是为了让用户不在外部调用类中的某个名字(属性或者方法)。如果完成私有化,那么这个类的封装度就更高了,封装度越高,类中的各种属性和方法的安全性越高,但是实现的过程代码越复杂。
在这里我们要明白一个事情,就是加了双下划线的名字(方法或者属性)为啥不能从类的外部调用了?
class User: __country = \'china\' def func(self): print(self.__country)# 在类的内部使用的时候,自动的把当前这句话所在的类的名字拼在私有变量前完成变形 print(User.__dict__) print(User._User__country) # china {\'__module__\': \'__main__\', \'func\': <function User.__func at 0x000001C9E16AC708>, \'country\': \'china\', \'__dict__\': <attribute \'__dict__\' of \'User\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'User\' objects>, \'__doc__\': None} {\'__module__\': \'__main__\', \'_User__func\': <function User.__func at 0x000001C9E16AC708>\'_User__country\': \'china\', \'__dict__\': <attribute \'__dict__\' of \'User\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'User\' objects>, \'__doc__\': None} User.__aaa = \'bbb\' # 在类的外部根本不能定义类的私有的概念我们还要明白一个问题是,私有的内容能不能被子类使用呢?答案是不能。私有的内容不能被子类使用。下面两个程序,我们需要注意,同时也有相应的分析程序的过程。
class Foo(object): def __init__(self): self.func() def func(self): print(\'in Foo\') class Son(Foo): def func(self): print(\'in Son\') Son() # in son class Foo(object): def __init__(self): self.__func() def __func(self): print(\'in Foo\') class Son(Foo): def __func(self): print(\'in Son\') Son() # in Foo|
|在其他语言中的数据的级别都有哪些?在python中有哪些呢?
public 共有的 类内和类外都可以用,父类和子类都可以用 python支持 java c++支持
protect 保护的 类内可以用,父类子类都可以用,类外不能用 python不支持 java c++支持
private 私有的 在本类的类的内部可以用,类内可以用,本类能用,父类子类不能用,类外不能用 python支持 java c++支持