私有方法和私有属性的访问

通过类内部方法访问私有方法

# 类内方法 访问类和实例的私有方法
class test(object):

    def __init__(self):
        self.num = 10
        self._num = 20
        self.__num = 30
    
    # 类内方法访问实例私有变量
    def __secret(self):
        # 内部的方法是可以访问得到私有属性的
        print(f'内部可以访问私有属性self.__num:{self.__num}')

    def fun(self):
        self.__secret()

t = test()
t.fun()

 

通过类内部方法访问私有属性

# 类内方法 访问类和实例的私有属性
class test(object):
    __old = "无法在外部访问"
    _old = "类对象和子类可以访问"
    old = "类变量,外部可访问。"

    def __init__(self):
        self.num = 10
        self._num = 20
        self.__num = 30
    
    # 类内方法访问实例私有变量
    def secret(self):
        # 内部的方法是可以访问得到私有属性的
        print(f'内部可以访问私有属性self.__num:{self.__num}')
    
    # 类内方法访问 类私有变量
    def secret1(self):
        # 内部的方法是可以访问得到私有属性的
        print(f"通过类名访问类变量test.__old:{test.__old}")
        print(f"通过传入的对象名访问类变量self.__old:{self.__old}")  # 传入对象时,没有找到实例属性,则继续找类属性

t = test()
t.secret() # 内部方法可以访问私有变量

test.secret1(test)
test.secret1(t)
# print(t.__num)  # AttributeError: 'test' object has no attribute '__num'

 

通过类和实例访问私有属性和方法

# 私有属性和方法
'''
总结:双下滑线私有属性和方法只能在类内部访问,外部不能访问;
单下划线私有属性和方法,类和子类能访问,是里不能访问
'''
class test(object):
    __old = "无法在外部访问"
    _old = "类对象和子类可以访问"
    old = "类变量,外部可访问。"

    def __init__(self):
        self.num = 10
        self._num = 20
        self.__num = 30
    
    def secret(self):
        # 内部的方法是可以访问得到私有属性的
        print(f'内部可以访问私有属性self.__num:{self.__num}')

    def __hello(): # 外部不能访问
        print('该方法外部访问不到')
        print("内部调用私有变量__old:", test.old)
    
    def _hi(): # 类对象可以访问
        print('该私有方法类和子类可以访问,实例不能访问。',end="")
        print("内部调用私有变量__old:",test.old)
    
t = test()

# 通过类对象访问 方法
test._hi() # 类对象能访问单下划线私有方法
# t._hi() # 实例对象不能访问单下划线私有方法

# 通过实例对象访问 实例变量
print(t.num)    # 10
print(t._num)   # 20
t.secret()
# print(t.__num)  # AttributeError: 'test' object has no attribute '__num'

# 通过实例对象访问 类变量
print(t._old)    # 
print(t.old)   # 

# 通过类对象访 类变量
print(test._old) # "类对象和子类可以访问"
print(test.old) # "类变量 外部可访问"
# print(test.__old) #AttributeError type object 'test' has no attribute '__old'

 

posted @ 2022-10-29 23:21  yudai  阅读(34)  评论(0编辑  收藏  举报