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. Java 8特性

    1. Java8的新特性 1.1. Lambda表达式和函数式接口 最简单的Lambda表达式可以用逗号分隔的参数列表.->符号和功能语句块来表示.示例如下: Arrays.asList( &q ...

  2. ubuntu启动流程和要读取相关文件

    当前系统环境为:linux mint mate 17.1(基于ubuntu14.04的衍生版) 查阅资料后总结如下: 首先: /etc/rc.d链接目标为:/etc /etc/rc*.d文件夹中的脚本 ...

  3. mybatis思维导图(二)

    写在前面 上一篇文章写了mybatis的基本原理和配置文件的基本使用,这一篇写mybatis的使用,主要包括与sping集成.动态sql.还有mapper的xml文件一下复杂配置等.值得注意的是,导图 ...

  4. DapperExtensions 使用教程

    最近搭建一个框架,使用dapper来做数据库访问,数据是sql server2012,支持多个数据库.事务.orm.ado.net原生操作方式,非常方便. 使用dapper的原因网上有很多文章说明,这 ...

  5. (转)unordered_map与map的对比(C++11新特性)

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  6. SSH不能连接虚拟机中的Ubuntu

    设置 网络 既然要远程ubuntu的系统.那么首先是两个网络是不是在一个网段.能不能ping的通? a) Windows电脑上--cmd 打开命令窗口.键入:ipconfig 命令.查看主机IP. b ...

  7. Short jhat tutorial: diagnosing OutOfMemoryError by example

    转自: http://petermodzelewski.blogspot.com/2013/06/short-jhat-tutorial-diagnosing.html jhat这个工具经过使用, 发 ...

  8. 微信小程序中使用阿里字体图标

    在微信小程序中使用阿里字体图标 ,不通过转换成base64的方式实现. 为了美化微信小程序,可以适当的使用一些小图标,这样体验也更友好些,于是决定使用常用的字体图标. 下载图标 首先在阿里字体图标查找 ...

  9. Android-隐式意图激活所有应用

    显示意图 与 隐式意图 对比 显示意图不能激活多个组件,只能激活一个组件 隐式意图能激活多个组件 显示意图只能在自身应用激活,不能激活其他应用 隐士意图能在自身应用激活,也能激活其他应用 每个应用程序 ...

  10. php数组倒叙支持多维数组

    <?php //一维数组 $test1 = array("a"=>"苹果","b"=>"香蕉",&qu ...