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. extends注意事项

    属性可以在子类中被调用,而局部变量不可以

  2. [GO]文件的读写

    首先写一个文件 package main import ( "os" "fmt" ) func WriteFile(path string) { //打开文件, ...

  3. 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)

    本篇文章主要介绍了"两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)",主要涉及到两款JSON类库Jackson与JSON-lib的性能对比(新增第三款 ...

  4. win7 iis7 ftp配置

    1.安装ftp服务器 开始菜单找到控制面板>在左侧找到打开或关闭windows功能点击 弹出如下对话框, 在弹出的对话框中找到Internet信息服务,如下 然后如上图所示,选中ftp服务器复选 ...

  5. (转)jQuery插件编写学习+实例——无限滚动

    原文地址:http://www.cnblogs.com/nuller/p/3411627.html 最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简 ...

  6. ACM 超级楼梯 发工资

    超级楼梯 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input 输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M( ...

  7. JavaScript - this详解 (二)

    用栗子说this Bug年年有,今年特别多 对于JavaScript这么灵活的语言来说,少了this怎么活! function 函数 this 对于没有实例化的function,我们称之为函数,即没有 ...

  8. 解读DbContext中的三种【EagerLoad,LazyLoad,ExplicitLoading】加载模式

    一:立即加载,延迟加载,显式加载 1. 立即加载 Student Domain{ Teacher theacher} using (SchoolDBEntities db = new SchoolDB ...

  9. [LeetCode 题解]: Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. 题解: 寻找一组字符串的最 ...

  10. 微软2014实习生招聘笔试第2题 the k-th string

    Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that ...