python之类与对象(2) 3. 类函数的进阶
3.1 类函数调用类属性
关于类函数调用类属性,我们尝试修改前一节的内容,以我们在之前学习的内容,调用属性直接用%+属性就可以了,那我们来试一下:
看到了程序有报错,这其实是因为在类函数中要调用类属性,必须要在类属性之前加上self关键字,调用方法是self.类属性名,那我们修改一下,加上self。
1 #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 # @Time :2018/12/3 16:33 4 # @Author :Yosef 5 # @Email :wurz529@foxmail.com 6 # @File: :animal.py 7 # @Software :PyCharm Community Edition 8 class Animal: 9 '''' 10 name,sex,age是Animal的属性 11 ''' 12 name = "TOM" 13 sex = "male" 14 age = "5" 15 16 ''' 17 eat,run是Animal的方法 18 ''' 19 def eat(self): 20 print("这是一只会吃肉的小脑斧,我的名字是:%s"%self.name) 21 22 def run(self): 23 print("我不仅会吃,还会跑!!") 24 25 tiger1 = Animal() # 实例一个对象 26 27 ''' 28 调用类属性以及方法 29 ''' 30 tiger1.eat() 31 tiger1.run() 32 print("这是一只叫%s的小脑斧!" %tiger1.name) 33 print(tiger1.age) 34 print(tiger1.sex)
结果:
3.2 类函数带有位置参数
刚刚的例子是类函数中不带有参数,如果带有参数呢?我们先试着self.参数名来试一下?
运行结果还是发现报错了,报错信息说丢失参数。那么就说明,用self.name是没办法呼应传入的参数的。把self删掉,再试一下:
1 class Animal: 2 '''' 3 name,sex,age是Animal的属性 4 ''' 5 name = "TOM" 6 sex = "male" 7 age = "5" 8 9 ''' 10 eat,run是Animal的方法 11 ''' 12 def eat(self, name): 13 print("这是一只会吃肉的小脑斧,我的名字是:%s" % name) 14 15 def run(self): 16 print("我不仅会吃,还会跑!!") 17 18 tiger1 = Animal() # 实例一个对象 19 20 ''' 21 调用类属性以及方法 22 ''' 23 tiger1.eat("TOM")
结果运行成功,类函数其实跟学习的普通函数没有啥区别,就是在编写类函数的时候,需要在函数后面的括号里,传入一个self关键字。这就是唯一跟普通函数的区别,加上位置参数之后,跟普通函数也是没有其他的区别。
3.3 类函数带有默认参数
刚刚的例子是类函数中传入没有默认值的参数,如果有要有默认值怎么办嘞?
1 #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 # @Time :2018/12/3 16:33 4 # @Author :Yosef 5 # @Email :wurz529@foxmail.com 6 # @File: :animal.py 7 # @Software :PyCharm Community Edition 8 class Animal: 9 '''' 10 name,sex,age是Animal的属性 11 ''' 12 name = "TOM" 13 sex = "male" 14 age = "5" 15 16 ''' 17 eat,run是Animal的方法 18 ''' 19 def eat(self, name="James"): 20 print("这是一只会吃肉的小脑斧,我的名字是:%s" % name) 21 22 def run(self): 23 print("我不仅会吃,还会跑!!") 24 25 tiger1 = Animal() # 实例一个对象 26 27 ''' 28 调用类属性以及方法 29 ''' 30 tiger1.eat("TOM") 31 tiger1.eat() 32 # tiger1.run() 33 # print("这是一只叫%s的小脑斧!" %tiger1.name) 34 # print(tiger1.age) 35 # print(tiger1.sex)
可以看到类函数中的位置参数如果带有默认参数,那么在创建实例调用函数的时候,如果传了值运用用户传入的值,如果没有传值,就会自动使用默认参数。
如果类函数里面同时有位置参数以及默认参数,他们的参数位置顺序,有何要求呢?看以下代码:
1 class Animal: 2 '''' 3 name,sex,age是Animal的属性 4 ''' 5 name = "TOM" 6 sex = "male" 7 age = 5 8 9 ''' 10 eat,run是Animal的方法 11 ''' 12 def eat(self, name="James", age): 13 print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s了" % (name, age)) 14 15 def run(self): 16 print("我不仅会吃,还会跑!!") 17 18 tiger1 = Animal() # 实例一个对象 19 20 ''' 21 调用类属性以及方法 22 ''' 23 tiger1.eat("TOM",5)
然后出现了surprise:
造成这个的原因是这种错误原因是将没有默认值的参数在定义时放在了有默认值的参数的后面。也就是说,在传参时,没有默认值的参数必须要放在有默认值的位置参数之前。那么我们把两个参数互换一下位置:
1 class Animal: 2 '''' 3 name,sex,age是Animal的属性 4 ''' 5 name = "TOM" 6 sex = "male" 7 age = 5 8 9 ''' 10 eat,run是Animal的方法 11 ''' 12 def eat(self, age, name="James"): 13 print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age)) 14 15 def run(self): 16 print("我不仅会吃,还会跑!!") 17 18 tiger1 = Animal() # 实例一个对象 19 20 ''' 21 调用类属性以及方法 22 ''' 23 tiger1.eat(5,"TOM")
这次就很nice没有出现问题。
3.4 类函数之间的相互调用
正常函数可以相互调用,类函数也可以相互调用,具体怎么来的以及有什么区别,来详细看一下吧。
3.4.1 类函数内调里不带参数的类函数
调用不带任何参数的类函数,跟普通的函数并没有啥区别,只是我们需要在函数之前加入关键字:self。
1 class Animal: 2 '''' 3 name,sex,age是Animal的属性 4 ''' 5 name = "TOM" 6 sex = "male" 7 age = 5 8 9 ''' 10 eat,run是Animal的方法 11 ''' 12 def eat(self, age, name="James"): 13 print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age)) 14 self.run() 15 16 def run(self): 17 # self.eat(5) 18 print("我不仅会吃,还会跑!!") 19 20 21 tiger1 = Animal() # 实例一个对象 22 23 ''' 24 调用类属性以及方法 25 ''' 26 # tiger1.run() 27 tiger1.eat(5)
这里发现成功调用了。
3.4.2 类函数内调用带参数的类函数
调用带参数的类函数,必须要把他的参数传入,否则运行肯定报错。这就需要我们改写类函数!!要带上被调用类函数的参数。
1 #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 # @Time :2018/12/3 16:33 4 # @Author :Yosef 5 # @Email :wurz529@foxmail.com 6 # @File: :animal.py 7 # @Software :PyCharm Community Edition 8 class Animal: 9 '''' 10 name,sex,age是Animal的属性 11 ''' 12 name = "TOM" 13 sex = "male" 14 age = 5 15 16 ''' 17 eat,run是Animal的方法 18 ''' 19 def eat(self, age, sex, name="James"): 20 print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age)) 21 self.run(sex) 22 23 def run(self,sex): 24 # self.eat(5) 25 print("我性别是%s,不仅会吃,还会跑!!"%sex) 26 27 28 tiger1 = Animal() # 实例一个对象 29 30 ''' 31 调用类属性以及方法 32 ''' 33 # tiger1.run() 34 tiger1.eat(5,"male") 35 # print("这是一只叫%s的小脑斧!" %tiger1.name) 36 # print(tiger1.age) 37 # print(tiger1.sex)
结果成功:
3.5 类函数带有动态参数
还记得动态参数吧,就是*args,类函数中怎么使用动态参数呢?这一点其实跟以前还是一样,没有什么区别。
1 class Animal: 2 '''' 3 name,sex,age是Animal的属性 4 ''' 5 name = "TOM" 6 sex = "male" 7 age = 5 8 9 ''' 10 eat,run是Animal的方法 11 ''' 12 def eat(self, age, sex, name="James"): 13 print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age)) 14 self.run(sex) 15 16 def run(self,sex): 17 # self.eat(5) 18 print("我性别是%s,不仅会吃,还会跑!!"%sex) 19 20 def eatfood(self, *args): 21 for food in args: 22 print("我的食物有:%s" %food) 23 24 25 tiger1 = Animal() # 实例一个对象 26 27 ''' 28 调用类属性以及方法 29 ''' 30 tiger1.eatfood("肉", "水果", "胡萝卜")
3.6 类函数带有关键字参数
1 class Animal: 2 '''' 3 name,sex,age是Animal的属性 4 ''' 5 name = "TOM" 6 sex = "male" 7 age = 5 8 9 ''' 10 eat,run是Animal的方法 11 ''' 12 def eat(self, age, sex, name="James"): 13 print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age)) 14 self.run(sex) 15 16 def run(self,sex): 17 # self.eat(5) 18 print("我性别是%s,不仅会吃,还会跑!!"%sex) 19 20 def eatfood(self, *args): 21 for food in args: 22 print("我的食物有:%s" %food) 23 24 def getInfomation(self, **kwargs): 25 print("我的个人信息是:%s"%kwargs) 26 27 28 tiger1 = Animal() # 实例一个对象 29 30 ''' 31 调用类属性以及方法 32 ''' 33 tiger1.getInfomation(name="jerry", age="6",sex="female")