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

如何理解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
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从未止步..

谢谢你的打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值