类的结构

实例

使用面向对象开发时,第一步是设计类;

当使用 类名() 创建对象时,会自动执行以下操作:

1.为对象在内存中分配空间--创建对象;

2.为对象的属性 设置初始值--初始化方法(init);

对象创建后,内存中就有了一个对象的实实在在的存在--实例

因此通常也会把:

1.创建出来的对象叫做类的实例;

2.创建对象的动作叫实例化;

3.对象的属性叫实例属性;

4.对象调用的方法叫实例方法;

在程序执行时:

1.对象各自拥有自己的实例属性;

2.调用对象方法,可以通过self. 访问自己的属性/调用自己的方法;

结论:

1.每一个对象都有自己的内存空间,保存各自不同的属性;

2.多个对象的方法,在内存中只有一份,在调用方法的时候,需要把对象的引用传递到方法内部;

类是一个特殊的对象

Python中,一切皆对象:

class AAA: 定义的类属于类对象;
obj1 = AAA() 属于实例对象;
  • 程序运行时,类同样会被加载到内存中;
  • 在Python中,类是一个特殊的对象--类对象;
  • 在程序运行时,类对象在内存中只有一个,使用一个类可以创建出很多对象实例;
  • 除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法--类属性;类方法;
  • 通过类名. 的方式可以访问类的属性或者调用类的方法;

代码分层为:

1.类属性

2.类方法(cls)

3.__init__定义实例属性

4.实例方法(self)

类属性和实例属性

类属性的定义及使用

类属性就是给类对象定义的属性;

通常用来记录与这个类相关的特征;

类属性不会用于记录具体对象的特征;

定义一个植物类,每新添一种植物就让植物类计数+1

class Plant(object):
# 使用赋值语句定义类属性,记录所有植物对象的数量
count = 0 def __init__(self, name):
self.name = name
# 每初始化一次,就让类属性的值+1
Plant.count += 1 # 创建植物对象
duorou = Plant("多肉")
print("目前已养植物种类数量:", Plant.count)
# 目前已养植物种类数量: 1 luhui = Plant("芦荟")
yingtao = Plant("樱桃")
# 输出植物对象的总数
print("目前已养植物种类数量:", Plant.count)
# 目前已养植物种类数量: 3

属性的查找机制-向上查找

在python中 属性的获取存在一个向上查找机制:

1.首先在对象内部查找对象属性;

2.没有找到就会向上查找类属性;

因此,要访问类属性有两种方式

1.类名.类属性

2.对象.类属性(不推荐)

注意:如果使用 对象.类属性=值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值;

可以用 对象.类属性 查看类属性,但不能用 对象.类属性=值 给它赋值;

如果使用 对象.类属性=值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值;

类方法和静态方法

类方法

类方法概念和定义语法

类属性 就是针对类对象定义的属性;

使用赋值语句在关键字class下面可以定义类属性;

类属性用来记录与这个类相关的特征;

类方法 就是针对类对象定义的方法;

在类方法内部可以直接调用类属性或者其他的类方法;

类方法定义语法如下:

@classmethod
def 类方法名(cls):
pass

类方法需要@classmethod来进行修饰,告诉解释器这是一个类方法;

类方法的第一个参数应该是cls;

由哪一个类调用的类方法,方法内部的cls就是哪一个类的引用;

这个参数和实例方法的第一个参数是self类似;

使用其他名称也可以,但一般习惯使用cls;

通过 类名. 调用类方法,调用类方法时,不需要传递cls参数;

在方法内部,

可以通过 cls. 调用类属性;

通过 cls. 也可以调用其他类的方法;

在类方法内部可以直接使用cls 访问类属性或者其他的类方法;

类方法案例演示

class Plant(object):
# 使用赋值语句定义类属性,记录所有植物对象的数量
count = 0 # 定义一个类方法
@classmethod
def show_count(cls):
print("目前已养植物种类数量:", Plant.count) def __init__(self, name):
self.name = name
Plant.count += 1 duorou = Plant("多肉")
luhui = Plant("芦荟") # 调用类方法
Plant.show_count() # 目前已养植物种类数量: 2

静态方法

静态方法概念和语法

在开发时,如果需要在类中定义一个方法,这个方法:

既不需要访问实例属性也不需要调用实例方法;

既不需要访问类属性也不需要调用类方法;

这个时候,就可以把这个方法封装成静态方法;

静态方法语法如下:

@staticmethod

def 静态方法名():

pass

静态方法需要修饰器 @staticmethod 来表示,告诉解释器这是一个静态方法;

通过 类名. 调用静态方法;

静态方法示例

class Dog(object):
@staticmethod
def run():
# 不需要访问类属性和实例属性的方法,就可以定义一个静态方法
print("跳着跑") def __init__(self, name):
self.name = name def bark(self):
pass # 通过 类名. 调用静态方法,不需要创建对象
Dog.run()

方法综合案例

案例需求

1.设计一个Game类

2.属性:

定义一个类属性top_score记录游戏最高分

定义一个实例属性palyer记录游戏玩家名字

3.方法:

静态方法show_help查看游戏帮助信息;

类方法show_topscore显示游戏最高分;

实例方法start_game开始当前玩家的游戏

4.主程序步骤

查看帮助信息

查看历史最高分

创建游戏对象,开始游戏

案例分析

历史最高成绩--类属性

玩家姓名--实例属性

显示玩法--静态方法

显示历史最高成绩--类方法

进入游戏--实例方法

综合案例演练

同时使用类属性,实例属性,静态方法,类方法,实例方法;

class Game(object):
top_score = 0
@staticmethod
def game_help():
print("游戏帮助信息")
@classmethod
def show_topscore(cls):
print("历史最高分数是:", cls.top_score) def __init__(self, name):
self.name = name def play_game(self):
print("%s 开始游戏了" % self.name) # 查看游戏帮助文档
Game.game_help()
# 查看历史最高分
Game.show_topscore()
# 创建游戏对象
xiaoming = Game("小明")
# 进入游戏
xiaoming.play_game() # 游戏帮助信息
# 历史最高分数是: 0
# 小明 开始游戏了

案例小结

1.实例方法--方法内部需要访问实例属性;方法内部可以使用 类名. 查看类属性;

2.类方法--方法内部只需要访问类属性;

3.静态方法--方法内部既不需要访问类属性也不需要访问静态属性;

提示:当一个方法内急需要访问实例属性也需要访问类属性时,应该使用示例方法;因为类只有一个,实例方法内部可以使用 类名. 查看类属性;

Python面向对象之类属性类方法静态方法的更多相关文章

  1. python的类的 静态属性 类方法 静态方法

    一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...

  2. Python Class 的实例方法/类方法/静态方法

    实例方法.类方法.静态方法 class MyClass(object): class_name = "MyClass" # 类属性, 三种方法都能调用 def __init__(s ...

  3. python__基础 : 类属性,类方法,静态方法

    类属性  定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 类属性用 实例.类属性   或者 类.类属性 都可以访问, 如 a = Te ...

  4. python 面向对象 私有属性

    __init__构造函数 self.name = name # 属性, 实例变量,成员变量,字段 def sayhi()# 方法, 动态属性 私有属性不对外看到 前面加上__ class role() ...

  5. python面向对象之类属性,实例属性

    python中的属性分为类属性和实例属性,之前已经说过一些,这里主要是对类属性与实例属性的增删改查 首先是对类属性的增删改查,下面这个是对类属性的修改,在书写类时,已经对类属性occupation进行 ...

  6. 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法

    属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property  比如,求面积,周长,平方,体脂 等运算时候 例如:   bmi是名词,最 ...

  7. python面向对象 : 属性, 类方法, 静态方法

    一. 属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. property应用 : 类似于bmi这种,area,周长.... 需要用到计算的.   # 求BMI体质数:BMI = 体 ...

  8. 面向对象property属性、静态方法和类方法

    一.property属性 1.什么是property特性? property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值. from math import pi class Circl ...

  9. Python - 面向对象编程 - 实例方法、静态方法、类方法

    实例方法 在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog: def __init__(self, name, age): print( ...

随机推荐

  1. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...

  2. 【原创】《从0开始学RocketMQ》—单机搭建

    内容目录 1. RocketMQ是什么? 2. 下载并解压 3. 启动NameServer 4. 启动 Broker 5. 关闭消息队列 1. RocketMQ是什么? RocketMQ是一种消息队列 ...

  3. 【CSS】少年,你想拥有写轮眼么?

    最近笔者在公司内部开展了一次CSS讲座,由于授课经验不太足,授课效果自我感觉并不太好,不过课中有一个笔者用CSS写的一个小效果,其中还是包含了蛮多CSS的常见知识点的,正好也有部分同学很感兴趣如何实现 ...

  4. Android系统的启动流程

    手机启动后首先会通过执行BootLoader来启动Linux内核,BootLoader是所有嵌入式设备开机启动执行的第一行代码,linux内核在启动过程中会加载各种设备的驱动同时初始化数据结构,并且开 ...

  5. 移动端UI自动化Appium测试——Windows系统Appium环境配置

    1.安装JDK,官网下载即可,这里用的1.8,环境变量配置 2.安装Android sdk,API >= 17,环境变量配置 3.安装Nodejs,官网http://nodejs.org/dow ...

  6. flex弹性布局操练1

    实现弹性布局之前常用浮动,相对定位和绝对定位等,但是现在好了,随着flex的兴起,方便了很多,而且也符合未来响应式布局的方向. 理论的东西可参考css3手册,这里专注实操. 一:单个元素 <di ...

  7. hibernate对象状态 的小问题

    Class classA{ List a; public void setA(List a) { this.a =a; } public List getA() { return this.a; } ...

  8. Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...

  9. Winform webbrowser 隐藏 html 元素

    目的:用webbrowser打开网页,并隐藏网页上某个html元素 1.如果已知元素ID,比较好办 直接使用webbrowser1.Document.getElementById("id&q ...

  10. 迅为IMX6UL工业级商业扩展级核心板兼容同一底板

    商业级IMX6UL核心板: ARM Cortex-A7架构 主频高达528 MHz 核心板512M DDR内存 8G EMMC 存储 运行温度:-20℃ ~ +80℃ CPU集成电源管理 核心板尺寸仅 ...