是否可以在python中拥有受保护的类变量或方法?我能看到这种用法的例子吗?
python提供两种特殊变量:
-私有变量 private
--受保护变量.
区别,就是第一个不能继承,第二个可以.
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"
如果你是一个人写代码的话..你所谓的受保护的变量应该是不会有函数改变的? 那设置全局变量或者私有应该可以达到你的要求吧?
如果你是协作的写代码的话..好像没有办法.只能默认加 __ 下划线
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'
这是不可能的。人们通常使用下划线作为私人会员的惯例。
关于一般python约定的这个问题可以提供更多信息。
Python“私有”函数编码约定
基本上在您的会员名称前加上'_'将向外界表明它是私人的。
not_private = 0
_private = 1
有些约定和良好的样式允许您指示某人不应该修改这些变量或从类外部调用这些方法,但是没有办法严格执行此操作。在Python中基本上没有严格强制的私有或受保护的变量或方法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。