开发者社区> 问答> 正文

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

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

展开
收起
一码平川MACHEL 2019-02-28 14:18:13 3903 0
6 条回答
写回答
取消 提交回答
  • python提供两种特殊变量:

    -私有变量 private

    --受保护变量.

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

    2019-11-18 18:05:17
    赞同 展开评论 打赏
  • 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"

    2019-07-17 23:29:44
    赞同 展开评论 打赏
  • 如果你是一个人写代码的话..你所谓的受保护的变量应该是不会有函数改变的? 那设置全局变量或者私有应该可以达到你的要求吧?
    如果你是协作的写代码的话..好像没有办法.只能默认加 __ 下划线

    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'

    2019-07-17 23:29:44
    赞同 展开评论 打赏
  • 不行

    2019-07-17 23:29:44
    赞同 展开评论 打赏
  • 这是不可能的。人们通常使用下划线作为私人会员的惯例。

    关于一般python约定的这个问题可以提供更多信息。

    Python“私有”函数编码约定

    基本上在您的会员名称前加上'_'将向外界表明它是私人的。

    not_private = 0
    _private = 1


    有些约定和良好的样式允许您指示某人不应该修改这些变量或从类外部调用这些方法,但是没有办法严格执行此操作。在Python中基本上没有严格强制的私有或受保护的变量或方法。

    2019-07-17 23:29:44
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载