三. python面向对象(私有属性)

一. 私有属性(封装)

# 侠义 上的封装  面向对象的三大特性之一
# 属性 和 方法都隐藏起来  不让你看到
# 如果要让内部属性不被外部属性直接访问    在属性前加上两个下划线__
# 在python中 如果在属性前加上两个下划线那么这个属性就变成了私有属性
# print(per.__money)  #在属性前面加上__不能访问内部属性
class person(object):
    def eat(self ,food):
        print("eat-- " +food)
        print(self.__money)      # 在内部打印私有属性

    def __init__(self,height ,weight ,money):
        # 定义属性
        self.height =height
        self.weight =weight
        self.__money =money    #  定义私有属性

per =person(300 ,100 ,20000)
per.age =1000000000000000000000000
print(per.age)  # 1000000000000000000000000
# print(per.__money)   # 在属性前面加上__不能访问内部属性  会报错   所以只要在内部访问
per.eat("玻璃")


# 如果要让内部属性不被外部属性直接访问    在属性前加上两个下划线__   
# 在python中 如果在属性前加上两个下划线那么这个属性就变成了私有属性
# 如果你想被外部访问内部属性直接加上  __                   列如这里__money  

1. 修改私有属性

class person(object):
    def __init__(self, height, weight, money):
        # 定义属性
        self.height = height
        self.weight = weight
        self.__money = money
        # 通过内部的方法 修改私有属性
        # 通过自定义的方法实现对私有属性的赋值和取值
    def setMoney(self, money):
            # 数据过滤
            if money < 0:
                money = 0
            self.__money = money
    def getMoney(self):
            return self.__money

    def run(self):
        print(self.__money)  # 内部访问     #22222222元

per = person( 300, 100, "22222222元")
per.run()#  22222222元

per.setMoney(100)

per.run() # 100
# 在python中 __xxx__属于特殊变量 可以直接访问的

class person(object):
    def __init__(self, height, weight, money):
        # 定义属性
        self.__height__= height
        self.weight = weight
        self.__money = money
        # 通过内部的方法 修改私有属性
        # 通过自定义的方法实现对私有属性的赋值和取值
    def setMoney(self, money):
            # 数据过滤
            if money < 0:
                money = 0
            self.__money = money
    def getMoney(self):
            return self.__money

    def run(self):
        print(self.__money)  # 内部访问     #22222222元
        print(self.__height__)   #300


per = person( 300, 100, "22222222元")
per.run()#  22222222元
per.setMoney(100)
per.run() # 100
print(per.__height__)   # 300

2.私有方法

class Per(object):
    __key=55555         #静态属性 也可以变成私有属性
    def __init__(self,name,passwd,age):
        self.name=name
        self.__passwd=passwd     #  加上__ 私有属性
        self.__age=age

    def get_pwd(self):
        print(self.__dict__)
        print(self.__key,"静态私有属性")
        return  self.__passwd      #   只有在类的内部使用私有属性 就会自动的带上 _类命



    def __agel(self):             # 加上__私有方法
        # print(self.__doc__)
        print("私有方法!!!!!!")
        return self.__age

    def login(self):                #内部调用私有方法    外部取不到

        self.__agel()
aa=Per("张三","123456",'222')

print(aa.get_pwd())
# {'name': '张三', '_Per__passwd': '123456', '_Per__age': '222'}
# 55555 静态私有属性
# 123456


print(aa.login())
# None
# 私有方法!!!!!!
# None

# print(aa._Per__passwd)  # 不能这么调用      单下划线   '_Per__age
# print(aa._Per__age)  # 不能这么调用      单下划线   '_Per__age
# # 123456
# # 222

aa.login()
# 私有方法!!!!!!
class Room(object):

    def __init__(self,name,length,width):
        self.name=name
        self.__length=length
        self.__width=width


    def area(self):
        print(self.__width)   #  10
        return  self.__length*self.__width

aa=Room("张三",22,10)

print(aa.area())  # 220

print(aa.__dict__)  # {'name': '张三', '_Room__length': 22, '_Room__width': 10}

print(aa._Room__width)   # 10
# 假设 父类的私有属性 能被 子类 调用吗    答案是 不能的         说明不能被继承
class Foo:
    __key='1223'
class Son(Foo):
    print(Foo.__key)

猜你喜欢

转载自www.cnblogs.com/Sup-to/p/10878954.html