【python】class之类的定义
Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性。
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
使用class定义类,可以提供一个可选的父类或者基类,如果没有合适的基类,那就使用object作为基类,也可以不写。新式类写法:class FooClass (object);就旧式类写法:
class Role(object): #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法
def __init__(self,name,role,weapon,life_value=100,money=15000):
#当一个类实例化时,_init_()方法会自动执行,该方法目的是对实例初始化工作。
# 同样通过创建自己的_init_()方法,可以覆盖默认的_init_()方法
self.name = name #__init__中的第一个参数self,和这里的self都 是什么意思? 看下面解释
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def shot(self,name):
print("shooting...%s"%name) def got_shot(self):
print("ah...,I got shot...") def buy_gun(self, gun_name):
print("just bought %s" % gun_name) def __del__(self): ##析构函数
print("it is over") r1 = Role('Alex', 'police', 'AK47')
#生成一个角色,Role('Alex', 'police', 'AK47')为实例化的对象地址,把对象地址传给r1
#也可以通过Role('Alex', 'police', 'AK47').shot('paul')调用
r1.shot("paul")
#>>>shooting...paul r2 = Role('Jack', 'terrorist', 'B22') #生成一个角色,此时self 相当于 r2 , Role(r1,'Alex','police','AK47’)
r2.got_shot()
#>>>ah...,I got shot...
上面的这个__init__()叫做初始化方法(或构造方法), 在类被调用时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作。__del__为析构函数,在实例释放,销毁时候被执行,常用语一些收尾工作,比如关闭数据库连接或者打开临时文件。我们这里写的__init__(self,name,role,weapon,life_value=100,money=15000)就是要在创建一个角色时给它设置这些属性,那么这第一个参数self是干毛用的呢?
self为实例本身,用于关联调用类的属性和方法。
封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容。
类属性和实例属性
- 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;用于存储实例共有的属性,节省开销
- 类体中,所以函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
- 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
实例变量只能通过对象名访问,无法通过类名访问。
通过类名修改类变量,会作用到所有的实例化对象。通过类对象是无法修改类变量的。通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量
class Person(object):
county='CN'
def __init__(self,name,age):
self.name = name
self.role = age def shot(self,name):
print("shooting...%s"%name) def got_shot(self):
print("ah...,I got shot...") print(Person.county) ##获取类变量
#>>>CN
P1=Person('PAUL','22')
print(P1.county) ##获取类变量
#>>>CN
P1.county='HK' ##并不是修改类变量,通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量
print(P1.county) ##获取新加的实例变量
#>>>HK
P2=Person('EVA','23')
print(P2.county) ##获取类变量
#>>>CN
Person.county='US' ##通过类名修改类变量,会作用到所有的实例化对象
##类中,实例变量和类变量可以同名,但这种情况下使用类对象将无法调用类变量,它会首选实例变量,这也是不推荐“类变量使用对象名调用”的原因。
print(P1.county) ##获取新加的实例变量
#>>>HK
print(P2.county) ##获取类变量
#>>>US
P3=Person('kate','25')
print(P3.county)获取类变量
#>>>US
值得一提的是:除了可以通过类名访问类变量之外,还可以动态地为类和对象添加类变量
class Person(object):
county='CN'
def __init__(self,name,age):
self.name = name
self.role = age def shot(self,name):
print("shooting...%s"%name) def got_shot(self):
print("ah...,I got shot...") Person.job='IT'
P1=Person("PAUL",22)
print(P1.job)
#>>>IT
类方法和实例方法及静态方法
类方法:在方法前面加上@classmethod 这样的方法称为类方法,最少也要包含一个参数,只不过类方法中通常将其命名为 cls。调用类方法时,无需显式为 cls 参数传参
类方法可以修改类属性的值。类方法只能访问类变量,不能访问实例变量。
实例方法:带有self的都是实例方法。
静态方法:实际和类没有关系了,静态方法没有类似 self、cls 这样的特殊参数,类的静态方法中无法调用任何类属性和类方法。一般会完成和类对象也和实例对象没有关联的基本功能,如一些打印功能。
class Person(object):
county='CN'
def __init__(self,name,age):
self.name = name
self.role = age def got_shot(self):
print("ah...,I got shot...") @classmethod
def info(cls):
print("正在调用类方法") ##通过类方法修改类变量
Person.county='UK' @staticmethod
def msg(msg):
print('静态方法调用 %s'%msg) #####实例方法
P1=Person("PAUL",22)
P1.got_shot()###类对象直接调用
#>>>ah...,I got shot..
Person.got_shot(P1)##类名调用实例方法,但此方式需要手动给 self 参数传值
#>>>ah...,I got shot.. #####类方法
Person.info() ##使用类名直接调用类方法
#>>>正在调用类方法
P1.info()####使用类对象调用类方法
#>>>正在调用类方法
print(P1.county)
#>>>UK ####静态方法
Person.msg('ok')##使用类名直接调用类方法
#>>>静态方法调用 ok
P1.msg('ok')####使用类对象调用类方法
#>>>静态方法调用 ok
私有方法和变量
无论是私有类变量和方法还是私有实例变量和方法,类外都不能直接访问,只能在类内访问。
class Person(object):
county='CN'
__salary=100
def __init__(self,name,role,age):
self.name = name
self.role = role
self.__age = age def got_shot(self):
print("ah...,I got shot...") def __msg(self):
print('这是私有实例方法') def get_salary(self):
print(self.__salary)
self.__msg() P1=Person("paul",'IT','22')
P1.get_salary()
#>>>100
#>>>这是私有实例方法
【python】class之类的定义的更多相关文章
- python中的函数(定义、多个返回值、默认参数、参数组)
函数定义 在python中函数的定义以及调用如下代码所示: def test(x): y = x+1 return y result = test(2) print(result) 多个返回值的情况 ...
- Python函数的基本定义和调用以及内置函数
首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...
- python简单的函数定义和用法实例
python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...
- python中函数的定义及调用
python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...
- python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
- Python中函数的定义必须在调用的前面
# -*- coding:utf-8 -*- Python中函数的定义必须在调用的前面,但是在函数的内部调用一个函数,不用考虑顺序,只要被调用的函数被定义了即可 #标准的先函数定义,后函数调用def ...
- 第7.23节 Python使用property函数定义属性简化属性访问的代码实现
第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一. 背景 在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...
- Python使用property函数定义的属性名与其他实例变量重名会怎么样?
首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...
- Python使用property函数定义属性访问方法如果不定义fget会怎么样?
我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...
- python中的redis定义
redis官方介绍,python的redis客户端可以一处定义,处处使用.到底是不是这样呢?是不是只要在配置文件里定义一次,不管在哪都可以使用了? 下面用代码说明: import redis impo ...
随机推荐
- MyBatis:4
转载:http://www.cnblogs.com/xrq730/p/5289638.html 什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相 ...
- vs2015如何设置类或函数前不显示引用的数量
这几天,从vs2012换成vs2015,感觉15版本增加了一个类或函数前提示引用的数量,这个感觉很别扭,如何取消显示这个呢? 问题如下: 取消显示这个引用的步骤: 找到菜单栏: 工具 ---> ...
- hadoop mysql install (5)
reference : http://dblab.xmu.edu.cn/blog/install-mysql/ http://wiki.ubuntu.org.cn/MySQL #install mys ...
- C#:String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}...
int a = 12345678; //格式为sring输出// Label1.Text = string.Format("asdfadsf{0}adsfasdf",a);// ...
- C# 自动发送邮件被系统当做垃圾邮件退回的处理方法
前两天做了一个发送邮件的定时任务.其功能为在每天的某一时刻,系统自动从银行查询前一天的交易明细到本地服务器,解析后生成为各自不同Excel文件,并打包成zip压缩文件,然后抄送附件给财务对账.其中,邮 ...
- Hibernate: ids for this class must be manually assigned before calling save():
原文: http://blog.csdn.net/softimes/article/details/7008875 引起问题的原因: 由Hibernate根据数据库表自动生成的"类名.hbm ...
- golang多进程测试代码
package main import ( "fmt" "runtime" ) func test(c chan bool, n int) { x := 0 f ...
- Pandas 命令整理
在网上看到一个整理的很好的pandas命令合集,转一份供自己查找与参考
- Linux下mysql操作
1.linux下MYSQL的启动与访问 http://www.cnblogs.com/hunter007/articles/2251795.html 2.linux下mysql基本的操作 http:/ ...
- Mac OS 基于 VirtualEnv 的安装 tensorflow 1.3.0
如果不行的话,就用conda装吧 https://www.jianshu.com/p/d54546ab315e 推荐使用 virtualenv 创建一个隔离的容器, 来安装 TensorFlow. 这 ...