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