3. 类函数的进阶

3.1 类函数调用类属性

关于类函数调用类属性,我们尝试修改前一节的内容,以我们在之前学习的内容,调用属性直接用%+属性就可以了,那我们来试一下:

看到了程序有报错,这其实是因为在类函数中要调用类属性,必须要在类属性之前加上self关键字,调用方法是self.类属性名,那我们修改一下,加上self。

 #!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time :2018/12/3 16:33
# @Author :Yosef
# @Email :wurz529@foxmail.com
# @File: :animal.py
# @Software :PyCharm Community Edition
class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = "" '''
eat,run是Animal的方法
'''
def eat(self):
print("这是一只会吃肉的小脑斧,我的名字是:%s"%self.name) def run(self):
print("我不仅会吃,还会跑!!") tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.eat()
tiger1.run()
print("这是一只叫%s的小脑斧!" %tiger1.name)
print(tiger1.age)
print(tiger1.sex)

结果:

3.2 类函数带有位置参数

刚刚的例子是类函数中不带有参数,如果带有参数呢?我们先试着self.参数名来试一下?

运行结果还是发现报错了,报错信息说丢失参数。那么就说明,用self.name是没办法呼应传入的参数的。把self删掉,再试一下:

 class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = "" '''
eat,run是Animal的方法
'''
def eat(self, name):
print("这是一只会吃肉的小脑斧,我的名字是:%s" % name) def run(self):
print("我不仅会吃,还会跑!!") tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.eat("TOM")

结果运行成功,类函数其实跟学习的普通函数没有啥区别,就是在编写类函数的时候,需要在函数后面的括号里,传入一个self关键字。这就是唯一跟普通函数的区别,加上位置参数之后,跟普通函数也是没有其他的区别。

3.3 类函数带有默认参数

刚刚的例子是类函数中传入没有默认值的参数,如果有要有默认值怎么办嘞?

 #!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time :2018/12/3 16:33
# @Author :Yosef
# @Email :wurz529@foxmail.com
# @File: :animal.py
# @Software :PyCharm Community Edition
class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = "" '''
eat,run是Animal的方法
'''
def eat(self, name="James"):
print("这是一只会吃肉的小脑斧,我的名字是:%s" % name) def run(self):
print("我不仅会吃,还会跑!!") tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.eat("TOM")
tiger1.eat()
# tiger1.run()
# print("这是一只叫%s的小脑斧!" %tiger1.name)
# print(tiger1.age)
# print(tiger1.sex)

可以看到类函数中的位置参数如果带有默认参数,那么在创建实例调用函数的时候,如果传了值运用用户传入的值,如果没有传值,就会自动使用默认参数。

如果类函数里面同时有位置参数以及默认参数,他们的参数位置顺序,有何要求呢?看以下代码:

 class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = 5 '''
eat,run是Animal的方法
'''
def eat(self, name="James", age):
print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s了" % (name, age)) def run(self):
print("我不仅会吃,还会跑!!") tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.eat("TOM",5)

然后出现了surprise:

造成这个的原因是这种错误原因是将没有默认值的参数在定义时放在了有默认值的参数的后面。也就是说,在传参时,没有默认值的参数必须要放在有默认值的位置参数之前。那么我们把两个参数互换一下位置:

 class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = 5 '''
eat,run是Animal的方法
'''
def eat(self, age, name="James"):
print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age)) def run(self):
print("我不仅会吃,还会跑!!") tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.eat(5,"TOM")

这次就很nice没有出现问题。

3.4 类函数之间的相互调用

正常函数可以相互调用,类函数也可以相互调用,具体怎么来的以及有什么区别,来详细看一下吧。

3.4.1 类函数内调里不带参数的类函数

调用不带任何参数的类函数,跟普通的函数并没有啥区别,只是我们需要在函数之前加入关键字:self。

 class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = 5 '''
eat,run是Animal的方法
'''
def eat(self, age, name="James"):
print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age))
self.run() def run(self):
# self.eat(5)
print("我不仅会吃,还会跑!!") tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
# tiger1.run()
tiger1.eat(5)

这里发现成功调用了。

3.4.2 类函数内调用带参数的类函数

调用带参数的类函数,必须要把他的参数传入,否则运行肯定报错。这就需要我们改写类函数!!要带上被调用类函数的参数。

 #!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time :2018/12/3 16:33
# @Author :Yosef
# @Email :wurz529@foxmail.com
# @File: :animal.py
# @Software :PyCharm Community Edition
class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = 5 '''
eat,run是Animal的方法
'''
def eat(self, age, sex, name="James"):
print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age))
self.run(sex) def run(self,sex):
# self.eat(5)
print("我性别是%s,不仅会吃,还会跑!!"%sex) tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
# tiger1.run()
tiger1.eat(5,"male")
# print("这是一只叫%s的小脑斧!" %tiger1.name)
# print(tiger1.age)
# print(tiger1.sex)

结果成功:

3.5 类函数带有动态参数

还记得动态参数吧,就是*args,类函数中怎么使用动态参数呢?这一点其实跟以前还是一样,没有什么区别。

 class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = 5 '''
eat,run是Animal的方法
'''
def eat(self, age, sex, name="James"):
print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age))
self.run(sex) def run(self,sex):
# self.eat(5)
print("我性别是%s,不仅会吃,还会跑!!"%sex) def eatfood(self, *args):
for food in args:
print("我的食物有:%s" %food) tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.eatfood("肉", "水果", "胡萝卜")

3.6 类函数带有关键字参数

 class Animal:
''''
name,sex,age是Animal的属性
'''
name = "TOM"
sex = "male"
age = 5 '''
eat,run是Animal的方法
'''
def eat(self, age, sex, name="James"):
print("这是一只会吃肉的小脑斧,我的名字是:%s,今年%s岁了" % (name, age))
self.run(sex) def run(self,sex):
# self.eat(5)
print("我性别是%s,不仅会吃,还会跑!!"%sex) def eatfood(self, *args):
for food in args:
print("我的食物有:%s" %food) def getInfomation(self, **kwargs):
print("我的个人信息是:%s"%kwargs) tiger1 = Animal() # 实例一个对象 '''
调用类属性以及方法
'''
tiger1.getInfomation(name="jerry", age="",sex="female")

python之类与对象(2)的更多相关文章

  1. python基础——获取对象信息

    python基础——获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type( ...

  2. python 引用和对象理解

    今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...

  3. Python深入03 对象的属性

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python一切皆对象(object),每个对象都可能有多个属性(attribut ...

  4. Python的基础--对象 转

      对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示.每个对象均有标识符(identity).类型(type).值(value). 标识 ...

  5. Python可迭代对象、迭代器和生成器

    Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...

  6. Python的基础--对象

    对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示.每个对象均有标识符(identity).类型(type).值(value). 标识符. ...

  7. Python一切皆对象

    Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象. Java虽然也是面向对象编程的语言,但是血统没有Python纯正.比如Java的八种基本数据类型之一int,在持久化的 ...

  8. python引用和对象详解

    python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...

  9. 举例子来说明Python引用和对象

    今天看到这么一句奇怪的话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象分离 更 ...

  10. Python 获取类对象的父类

    参考 Get parent class name? Python 获取类对象的父类 给定一个类的对象a,要求获取该对象的父类. 方法: a.__class__.__bases__ 返回由该对象的父类组 ...

随机推荐

  1. loadrunner load generator设置init人数

    Load Generator中还有一个很重要的设置.就是用来设置init人数的,我们在运行脚本的时候会发现,在场景监控中,init默认不会超过50个人,也就是最大并发是50个人,我们想使用超过50个人 ...

  2. 一个新手后端需要了解的前端核心知识点之margin(二)

    最近以开发自己博客网站为出发点开始决心打牢几个非常重要的前端知识点: margin,这个在我刚刚接触编程的时候留下的困扰的东西,一开始只想着怎么快速开发自己的网站,别人的终归是别人的,想要挖墙脚,必须 ...

  3. myeclipse快捷键记忆

    提示 Alt+?自动排版 Ctrl+shift+f自动添加引入包 Ctrl+shift+O切换窗口 Ctrl+F6自动添加set get方法 Alt+shift+s r 查看都是哪里调用了该方法 Ct ...

  4. transition与animation的区别

    transition需要事件触发,animation可以直接自动触发,而且功能上更为强大,包括可以设置不同时间段的动画规则,还有状态的控制,事件等等.

  5. JavaWeb项目导入MyEclipse后变为JAVA项目项目【解决方法】

    问题描述:之前有个项目是Java web的项目,但是后来我导入到我电脑里的myEclipse里后就变成了Java项目.查找了资料解决了,网上大部分都是说在eclipse里解决这个问题,在myEclip ...

  6. 设计模式12: Proxy 代理模式(结构型模式)

    Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信, ...

  7. Android PendingIntent小结

    官方文档的解释   A description of an Intent and target action to perform with it.   注意有一个target action,既Pen ...

  8. .net 线程基础 ThreadPool 线程池

    1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...

  9. Nhibernate 存储过程获取返回值

    写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...

  10. jQuery获取各种input输入框的值

    1.获取一组radio单选框的值(name属性为一组的radio的name属性) var q1 = $("input[name=element_name]:checked").va ...