Python面向对象之类属性类方法静态方法

类的结构

实例

使用面向对象开发时,第一步是设计类;
当使用 类名() 创建对象时,会自动执行以下操作:
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.静态方法--方法内部既不需要访问类属性也不需要访问静态属性;
提示:当一个方法内急需要访问实例属性也需要访问类属性时,应该使用示例方法;因为类只有一个,实例方法内部可以使用 类名. 查看类属性;

原文地址:https://www.cnblogs.com/yifchan/p/python-1-17.html

时间: 2024-11-05 18:46:37

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

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

一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执

py.面向对象,属性,类方法,静态方法,反射

例一:BMI指数(bmi是计算而来的,# 但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)## 成人的BMI数值:# 过轻:低于18.5# 正常:18.5-23.9# 过重:24-27# 肥胖:28-32# 非常肥胖, 高于32# 体质指数(BMI)=体重(kg)÷身高^2(m)# EX:70kg÷(1.75×1.75)=22.86 # 1,初识属性:# class A:# def __init__(self, name, weight, height):# self

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

类属性  定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 0 类属性用 实例.类属性   或者 类.类属性 都可以访问, 如 a = Test()  用 a.num 可以访问 ,但是如果这个实例有一个实例属性 self.num 那么这样访问的其实是 self.num , 所以一般用 类.属性 即这样 Test.num 访问 类方法, 类方法是属于这个类的方法,定义方式为 前面加上装饰器 @classmethod 且第一个参数传递的

(一)Python入门-6面向对象编程:03类对象-类属性-类方法-静态方法

一:类对象 前面讲的类定义格式中,“class 类名:”.实际上,当解释器执行class 语句时, 就会创建一个类对象. [操作] #测试类对象的生成 class Student: pass #空语句 print(type(Student)) print(id(Student)) print(Student) s1 = Student() print(s1) Stu2 = Student s2 = Stu2() print(Stu2) print(s2) 运行结果: <class 'type'>

20180727 (面向对象的属性 类方法和静态方法)

一.属性:将一个方法,伪装成一个属性,在代码的级别上没有本质的提升,但是可以让其看起来更合理 property:类似于bmi这种,看起来像名词,实际是需要计算的(动词),或者遇到周长或者面积这种词的时候,需要使用property装饰器来对其进行伪装 例如: class Person: def __init__(self,name,weight,height): self.name = name self.weight = weight self.height = height def bmi(s

python面向对象-3类的静态方法和类方法

还是以上次的洗衣机例子: 1 class Washer: 2 company='ZBL' 3 def __init__(self,water=10,scour=2): 4 self._water=water #不想让用户直接访问实例变量,可以标志成私有 5 self.scour=scour 6 self.year=2000#这是生产日期 7 #属性包装,将water属性包装成方法,用户使用water时实际是访问的方法 8 @staticmethod #定义一个静态方法 9 def spins_m

Python面向对象—类属性和实例属性

属性:就是属于一个对象的数据或函数元素 类有类方法.实例方法.静态方法.类数据属性(类变量)和实例数据属性(实例变量). 类属性:包括类方法和类变量,可以通过类或实例来访问,只能通过类来修改. 实例属性:包括实例方法和实例变量 class MyClass(object): name = 'Anl' def __init__(self, age): self.age = age @classmethod def class_method(cls): print "I'm class method&

Python 面向对象 --- 私有属性和私有方法

01,应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望被外部访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加连个下划线,定义的就是 私有 属性或方法 class Women: def __init__(self, name): self.name = name self.__age = 18 # def __secret(self

Python面向对象 | 类属性

property property是一个装饰器函数,可以将一个方法伪装成属性,调用的时候可以不用加().@property被装饰的方法,是不能传参数的,因为它伪装成属性了. 装饰器的使用:在要装饰的函数.方法.类上面一行加上 @装饰器名字 装饰器的分类: 装饰函数 装饰方法:property 装饰类 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值: 过轻:低于18.5 正常:18.5-23.9 过重:24-27