python之类与对象(2)
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)的更多相关文章
- python基础——获取对象信息
python基础——获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type( ...
- python 引用和对象理解
今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...
- Python深入03 对象的属性
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python一切皆对象(object),每个对象都可能有多个属性(attribut ...
- Python的基础--对象 转
对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示.每个对象均有标识符(identity).类型(type).值(value). 标识 ...
- Python可迭代对象、迭代器和生成器
Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...
- Python的基础--对象
对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示.每个对象均有标识符(identity).类型(type).值(value). 标识符. ...
- Python一切皆对象
Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象. Java虽然也是面向对象编程的语言,但是血统没有Python纯正.比如Java的八种基本数据类型之一int,在持久化的 ...
- python引用和对象详解
python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...
- 举例子来说明Python引用和对象
今天看到这么一句奇怪的话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象分离 更 ...
- Python 获取类对象的父类
参考 Get parent class name? Python 获取类对象的父类 给定一个类的对象a,要求获取该对象的父类. 方法: a.__class__.__bases__ 返回由该对象的父类组 ...
随机推荐
- 一文读懂HDMI和VGA接口针脚定义
一文读懂HDMI和VGA接口针脚定义 摘自:http://www.elecfans.com/yuanqijian/jiekou/20180423666604.html HDMI概述 HDMI是高清 ...
- zigbee组播通信原理
组播: 在zigbee网络里面,把网络节点标记为组的方式来进行通信:发送模块如果发送的组号和网络里标记模块的组号相对应,那么这些模块就可以拿到这些无线数据包. 特点: 1.分组中组的编号有两个字节. ...
- GC Roots的理解以及如何判断一个对象为“垃圾”
http://blog.csdn.net/Great_Smile/article/details/49935307 这篇博客中讲解了哪些可以作为GC Roots以及如何判断一个对象为垃圾
- Oracle 用户验证日志
1.sysdba/sysoper 权限用户验证日志;2.非sysdba/sysoper 权限用户验证日志;3.关于sqlcode; 1.sysdba/sysoper 权限用户验证日志:在数据库设置了参 ...
- Android开发之Tween(补间动画)
在android中动画主要有三种,①帧动画(http://blog.csdn.net/dmk877/article/details/45893017)这篇文章已经详细的进行了讲解,②补间动画这也是这篇 ...
- (转)打造一套UI与后台并重.net通用权限管理系统
原文地址:http://www.cnblogs.com/LRBPMS/p/3425997.html 一.前言 从进行到软件开发这个行业现在已经有几年了,在整理出这个套开发框架之前自己做了不少重复造轮子 ...
- spring mvc 入门程序
入门程序 1.环境准备 myeclipse Spring jar 2.前端控制器设置 (web.xml) 所有的*.action请求通过org.springframework.web.servlet. ...
- 学习tomcat(一)----用IDEA调试tomcat源码
一直在使用tomcat,但却不怎么熟悉tomcat的"运作流程",今天就 参照参考文章进行了代码搭建(代码的github在文末),并修改了一些操作.学习下tomcat的" ...
- 设计模式13---桥接模式(Bridge Pattern)
桥接模式将抽象与具体实现分离,使得抽象与具体实现可以各自改变互不影响.桥接模式属于设计模式中的结构模式. 桥梁模式涉及的角色 抽象(Abstraction)角色:抽象定义,引用对接口对象的引用. 重新 ...
- redis内部数据结构
redis内部数据结构,是指redis在自身的构建中,基于这些特定的内部数据结构进行的. 简单动态字符串:Simple Dynamic String 双端链表 字典:Dictonary 跳跃表:ski ...