python之self的正确理解和访问限制的有关内容

导读:本篇文章讲解 python之self的正确理解和访问限制的有关内容,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

如何理解self?

先说结论:self可以理解为对象本身

举例:

#定义一个动物类
class Animal():
    #定义一个初始化方法
    def __init__(self,name):#self=dog,name="二哈"
        self.name = name
    #定义一个普通方法
    def printName(self):
        print('动物的名字是:%s'%self.name)  #self=dog
# 声明一个函数
def myPrint(animal): # animal = dog
    animal.printName()  # dog.printName(对象.方法名)
#实例化创建一个对象dog
dog = Animal('二哈')
print(dog.name)#输出name属性的属性值
#调用函数
myPrint(dog)  #把dog对象当做myPrint函数的参数 dog.name
二哈
动物的名字是:二哈

烤牛排实例:

class roast_beef():#定义烤牛排的实例
    def __init__(self):#编写关于roast_beef类的方法__init__()
    		#默认原始数据
        self.roast_time=0
        self.roast_level="生的"
        self.roast_Condiment= []#将顾客所需配料放在列表中
    #该方法的功能:用用户提供的时间判断牛排的烤制程度
    def cook(self,roast_times):
       self.roast_time+=roast_times
       if  0<roast_times<5:
           self.roast_level="不太熟"
       elif  5<roast_times<9:
            self.roast_level="口感很好"
       else:
            self.roast_level = "有点糊了"
    #该方法的功能:实现用户配料的存储
    def Condiment(self, roast_Condiments):
     #等价于s.roast_Condiment.append(roast_Condiments)
        self.roast_Condiment.append(roast_Condiments)     
s=roast_beef()
s.cook(7)#传递烤制时间
#传递所需配料
s.Condiment("黑胡椒")
s.Condiment("孜然")
print(s.roast_time)
print(s.roast_level)
print(s.roast_Condiment)

访问限制:

私有属性:

一般情况下,一个实例的属性不单单只有一个,通常有多种属性,但是,有些属性属于比较隐私化,我们不想让外界去调用它,此时,我们可以将其设置为私有属性,设置方法为:在属性前加两个下划线,此时属性名不能被外界访问了。

举例:

class People():
    def __init__(self,name,money):
        self.__name = name  # 定义私有属性name

私有属性的实现原理:

在python中,私有属性是通过改名的方式实现的,怎么理解呢?
举例:

class People():
    def __init__(self,name,money):
        self.__name = name  # 定义私有属性name
people1=People("易烊千玺")
print(people1.name)

通过上面的方法,我们将name改成了__name,python内部会将私有属性改成_People__name,所以使用people1.__name找不到该属性,此时编译器告诉我们没有这个属性。

AttributeError: 'People' object has no attribute 'name'

但是私有属性也不是完全没有办法去访问,既然python将其改变为了_People__name,那么我们就使用people1._People__name的方式看是否能访问私有属性name
在这里插入图片描述
私有属性被正确访问。

为什么要有私有属性呢?

因为在父类中定义的内部属性,不希望在外部改变,而子类在继承父类的同时,定义了相同的属性,则会将父类同名的属性覆盖,所以需要使用私有属性进行保护。

受保护属性:

在类中定义的属性,在属性前加_(一个下划线),则表示该属性为受保护的属性,受保护属性和私有属性目的一样,都是不希望外部修改该属性,将属性保护起来。

受保护属性的原理:

与私有属性不同的时,受保护属性在代码执行的过程中,对该属性并不会做任何处理,但程序员之间约定,不会在类外部使用该属性。
举例:

class People():
    def __init__(self,name):
        self._name = name  # 定义受保护属性name
people1=People("易烊千玺")
print(people1._name)

在这里插入图片描述
通过普通访问,受保护属性也被正确输出。

数据过滤:

当数据传递进来的时候,并不是每个数据都是我们所想要的,那么此时,我们便可以对传递的属性值进行筛选。
操作如下:

class People(object):
    #定义普通方法对属性设置
    def setName(self,value):
        #数据过滤
        if len(value) <= 4:
            self.__name = value
        else:
            print('名称的长度不能大于4个字符')
s=People()
s.setName("ob")
s.setName("obwivhdo")
print(s._People__name)#打印符合规定的数据
名称的长度不能大于4个字符
ob

除了上面使用s._People__name获取私有属性的属性值之外,我们还可以使用定义普通方法获取属性值。
操作如下:

class People(object):
    #定义普通方法对属性设置
    def setName(self,value):
        #数据过滤
        if len(value) <= 4:
            self.__name = value
        else:
            print('名称的长度不能大于4个字符')
        # 定义普通方法获取属性值
    def getName(self):
        return self.__name
s=People()
s.setName("dcb")
print(s.getName())
dcb

私有方法:

与私有属性相对应,私有属性,不希望外界可以获取的属性,那么私有方法即为不希望外界可以调用的方法,定义方法即为在方法名前加__(两个下划线)。
举例:

 def __sayHello(self):
        print('我的名字是:%s,我有%s存款' % (self.__name, self._money))

获取私有方法:

与获取私有属性的方法相同,可通过_类名__方法,或者编写一个公有方法进行获取。
举例:

class People(object):
    def __init__(self, name, money):
        self.__name = name  # 定义私有属性name
        self._money = money  # 定义受保护的属性money
    def setName(self, value):
        # 数据过滤
        if len(value) <= 4:
            self.__name = value
        else:
            print('名称的长度不能大于4个字符')
        # 定义普通方法获取属性值
    def getName(self):
        return self.__name
    # 定义私有方法
    def __sayHello(self):
        print('我的名字是:%s,我有%s存款' % (self.__name, self._money))
s=People("你好",1000)
s._People__sayHello()
我的名字是:你好,我有1000存款

编写共有方法,进行简介访问

   def test(self):
        print(self.__name)
        print(self._money)
        self.__sayHello()#等价于s.__sayHello()
s=People("你好",1000)
s.test()
你好
1000
我的名字是:你好,我有1000存款

修改属性值:

1:直接修改:对象.属性=新的属性值

举例:

class People(object):
    def __init__(self, name, money):
        self.__name = name  # 定义私有属性name
        self._money = money  # 定义受保护的属性money
s=People("你好",1000)
s.name="张三"
print(s.name)

在这里插入图片描述

2:间接修改:对象.要修改的属性方法名(” 新的属性值”)

举例:

class People(object):
    def __init__(self, name, money):
        self.__name = name  # 定义私有属性name
        self._money = money  # 定义受保护的属性money
        # 定义普通方法对属性设置
    def setName(self, value):
            # 数据过滤
        if len(value) <= 4:
            self.__name = value
        else:
            print('名称的长度不能大于4个字符')
        # 定义普通方法获取属性值
    def getName(self):
        return self.__name
        # 定义私有方法
    def __sayHello(self):
        print('我的名字是:%s,我有%s存款' % (self.__name, self._money))
        # 定义公有方法获取私有属性和私有方法
    def test(self):
        print(self.__name)
        print(self._money)
        self.__sayHello()
s=People("王俊凯",10)
s.setName("易烊千玺")
s.test()
易烊千玺
10
我的名字是:易烊千玺,我有10存款

特殊属性:

__xx__相当于公有属性,可以直接进行访问
举例:

class People(object):
    def __init__(self, name, money):
        self.__name__ = name  # 定义私有属性name
        self._money = money  # 定义受保护的属性money
s=People("彭于晏",10000000000)
print(s.__name__)
彭于晏

获取当前文件路径:

print(__file__)
C:/Users/Lenovo/PycharmProjects/pythonProject4/main.py

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81481.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!