美文网首页Python学习
29-成员保护和访问限制

29-成员保护和访问限制

作者: ju7ran | 来源:发表于2019-04-15 16:43 被阅读0次

    成员保护和访问限制

    隐藏属性

    class Dog:
        def set_age(self,new_age):
            if new_age>0  and new_age<=100:
                self.age = new_age
            else:
                self.age = 0
        
        def get_age(self):
            return self.age
    
    dog = Dog()
    dog.age = 10
    print(dog.name)
    
    dog.age = -10
    print(dog.name)
    
    dog.set_age(-10)
    age = dog.get_age()
    print(age)
    
    

    在类的内部,有各种变量和方法。这些数据成员,可以在类的外部通过实例或者类名进行调用,例如:

    class People:
        title = "人类"
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def print_age(self):
            print('%s: %s' % (self.name, self.age))
    
    obj = People("jack", 12)
    obj.age = 18
    obj.print_age()
    print(People.title)
    

    上面的调用方式是我们大多数情况下都需要的,但是往往我们也不希望所有的变量和方法能被外部访问,需要针对性地保护某些成员,限制对这些成员的访问。这样的程序才是健壮、可靠的,也符合业务的逻辑。

    在类似JAVA,PHP等语言中,有private关键字,可以将某些变量和方法设为私有,阻止外部访问。但是,Python没有这个机制,Python利用变量和方法名字的变化,实现这一功能。

    私有属性

    在Python中,如果要让内部成员不被外部访问,可以在成员的名字前加上两个下划线__,这个成员就变成了一个私有成员(private)。私有成员只能在类的内部访问,外部无法访问。

    class People:
        title = "人类"
        def __init__(self, name, age):
            self.__name = name
            self.__age = age
    
        def print_age(self):
            print('%s: %s' % (self.__name, self.__age))
    obj = People("jack", 18)
    obj.__name
    ------------------------------
    Traceback (most recent call last):
      File "F:/Python/pycharm/201705/1.py", line 68, in <module>
        obj.__name
    AttributeError: 'People' object has no attribute '__name'
    

    那外部如果要对__name__age进行访问和修改呢?在类的内部创建外部可以访问的get和set方法!

    class People:
        title = "人类"
        def __init__(self, name, age):
            self.__name = name
            self.__age = age
        def print_age(self):
            print('%s: %s' % (self.__name, self.__age))
        def get_name(self):
            return self.__name
        def get_age(self):
            return self.__age
        def set_name(self, name):
            self.__name = name
        def set_age(self, age):
            self.__age = age
    
    obj = People("jack", 18)
    obj.get_name()
    obj.set_name("tom")
    

    私有属性在类外部定义使用,参考
    https://blog.csdn.net/weixin_41765578/article/details/81533063

    私有方法

    class Dog:
        #私有方法
        def __send_msg(self):
            print("------正在发送短信------")
    
        #公有方法
        def send_msg(self, new_money):
            if new_money>10000:
                self.__send_msg()
            else:
                print("余额不足,请先充值 再发送短信")
    
    dog = Dog()
    dog.send_msg(100)
    
    
    

    相关文章

      网友评论

        本文标题:29-成员保护和访问限制

        本文链接:https://www.haomeiwen.com/subject/hyfpwqtx.html