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间接获取被封装的内容。

类属性和实例属性

  1. 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;用于存储实例共有的属性,节省开销
  2. 类体中,所以函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
  3. 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。

实例变量只能通过对象名访问,无法通过类名访问

通过类名修改类变量,会作用到所有的实例化对象。通过类对象是无法修改类变量的。通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量

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之类的定义的更多相关文章

  1. python中的函数(定义、多个返回值、默认参数、参数组)

    函数定义 在python中函数的定义以及调用如下代码所示: def test(x): y = x+1 return y result = test(2) print(result) 多个返回值的情况 ...

  2. Python函数的基本定义和调用以及内置函数

    首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...

  3. python简单的函数定义和用法实例

    python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...

  4. python中函数的定义及调用

    python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...

  5. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  6. Python中函数的定义必须在调用的前面

    # -*- coding:utf-8 -*- Python中函数的定义必须在调用的前面,但是在函数的内部调用一个函数,不用考虑顺序,只要被调用的函数被定义了即可 #标准的先函数定义,后函数调用def ...

  7. 第7.23节 Python使用property函数定义属性简化属性访问的代码实现

    第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一.    背景       在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...

  8. Python使用property函数定义的属性名与其他实例变量重名会怎么样?

    首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...

  9. Python使用property函数定义属性访问方法如果不定义fget会怎么样?

    我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...

  10. python中的redis定义

    redis官方介绍,python的redis客户端可以一处定义,处处使用.到底是不是这样呢?是不是只要在配置文件里定义一次,不管在哪都可以使用了? 下面用代码说明: import redis impo ...

随机推荐

  1. app.jsNodejs启动测试服务

    'use strict'; var express = require('express');var app = express('');var fs = require('fs'); app.get ...

  2. 使用Windbg解析dump文件

    WinDbg OllyDbg SoftICE (已经停止更新) 虽说WinDbg在无源码调试方面确实比较困难,但在调试内核方面却真的有独到之处. https://www.pediy.com/kssd/ ...

  3. photoshop cc 智能切图

    这节分享一个photoshop cc 开始有的自动生成图标的方法 psd练习文件 http://pan.baidu.com/s/1pL2dwL1 1 工具:我这里用的是photoshop cc 201 ...

  4. PHP:第三章——PHP中的可变函数

    PHP中的可变函数 <?php header("Content-Type:text/html;charset=utf-8"); function F(){ echo '999 ...

  5. SQL Server 调优系列进阶篇 - 深入剖析统计信息

    前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...

  6. Flash Player离线安装包下载指南

    在机房里装软件,没网是正常现象,有些老师要装Firefox/Chrome浏览器要有Flash,网上搜来搜去都是在线安装包一日在V2EX闲逛时发现了一位大神给出了Flash的离线安装包下载方式,在此立个 ...

  7. bzoj2438

    题解: tarjan+概率 首先tarjan缩点 然后计算一个x,计算方法: 1.每当有一个强连通分量i的入度为0,那么x++ 2.如果有一个强连通分量i,它的入度为0,且它连的每一条边只有他连,那么 ...

  8. 201621123010《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  9. Python int操作

    a = 1 # 1 print(a.bit_length()) #计算一个数字的二进制长度.没啥用

  10. 第32课 初探C++标准库

    有趣的重载: 实验: 将1左移到cout对象中. 将Test改名为Console,此时我们的本意是想让这个cout代表当前的命令行: cout代表命令行的一个实例,本意是想将1打印到命令行上. 我们在 ...