如何理解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