是否可以在python中拥有受保护的类变量或方法?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

是否可以在python中拥有受保护的类变量或方法?

一码平川MACHEL 2019-02-28 14:18:13 1989

是否可以在python中拥有受保护的类变量或方法?我能看到这种用法的例子吗?

Python
分享到
取消 提交回答
全部回答(6)
  • 游客aasf2nc2ujisi
    2019-11-18 18:05:17

    python提供两种特殊变量:

    -私有变量 private

    --受保护变量.

    区别,就是第一个不能继承,第二个可以.

    0 0
  • 知钵
    2019-07-17 23:29:44

    Python里一般通过两个"_"来表示访问者希望这个成员变量是私有的,实际上大部分IDE在这种情况下也无法补全,但借助python的反射机制来看,该方法只是把成员变量和类名混合在一起,设置了一个alias别名来禁止IDE或编辑器直接访问,如下:

    # -*- coding: utf-8 -*-
    
    
    class Student:
        def __init__(self, name):
            self.__name = name
    
    
    if __name__ == '__main__':
        s = Student("Charlie")
        for m in dir(s):
            if callable(m):
                continue
            elif m.find("__name") != -1:
                print("alias is {A}".format(A=m))
                print(getattr(s, m))

    在Python3.7下输出
    _Student__name 和"Charlie"

    0 0
  • 腾虎
    2019-07-17 23:29:44

    如果你是一个人写代码的话..你所谓的受保护的变量应该是不会有函数改变的? 那设置全局变量或者私有应该可以达到你的要求吧?
    如果你是协作的写代码的话..好像没有办法.只能默认加 __ 下划线

    0 0
  • 游客drl6uevi2k7uk
    2019-07-17 23:29:44

    Python中没有像C++中public和private这些关键字来区别公有属性和私有属性。它是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。

    class Plane(object):

    def __init__(self):

    self.mA = 100

    self.mB = 200

    self.__mC = 300

     
    p  = Plane()

    但是类的方法可以封装__私有属性,如下可以通过Student.get_name访问self.__name

    class Student(object): # 类名的括号里写继承的类,如果没有则写object,这是所有类都要继承的类

        school = '清华大学' # 直接在类中定义的属性为类属性,归Student类所有,所有实例都可以访问到,但是与java的静态变量不同,如果一个实例改变了school的值,那么这个新值就生效,且只对这一个实例生效

        def __init__(self, name, score): # 只要是class中定义的函数,第一个参数都要写self,并且调用时第一个参数都不必传
                                         # init 是特殊函数,在创建类时会调用,相当于java的构造函数
            self.__name = name # 可以直接self.新的变量名,注意,两个下划线开头的变量名为私有变量,不允许外部访问,但可以通过get和set方法访问和赋值
            self.__score = score # 以两个下划线开头且以两个下划线结尾的变量为特殊变量,特殊变量不是私有变量,允许外部访问,因此起变量名时不要起成这种特殊变量的格式

        def get_name(self):
            return self.__name

        def get_score(self):
            return self.__score

        def set_score(self, score):
            if 0 <= score <= 100:
                self.__score = score
            else:
                raise ValueError('bad score') # 手动抛出异常

        def get_grade(self):
            if self.__score >= 90:
                return 'A'
            elif self.__score >= 60:
                return 'B'
            else:
                return 'C'

    0 0
  • 王卡卡
    2019-07-17 23:29:44

    不行

    0 0
滑动查看更多
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程