面向对象编程opp(黑马学习笔记)---进阶部分(第二部分)

一、 类属性

相关的概念及说明

  1. 创建出来的对象叫做类的实例方法
  2. 创建出来的属性叫做类的实例属性
  3. 不同的实例的不同的属性在内中是不同的,是独立的
  4. 多个对象的方法在内存中只有一份,在调用的时候,需要把对象的引用传递到方法内部

二、类对象

[1]说明

class A(object):
	代码块

A其实也是一种对象,称为类对象

[2]特点

  1. 在程序运行的时候,类同样是加载到内存中去
  2. 在python中类是一个特殊的对象,称为类对象
  3. 在运行的时候,类对象只有一份,使用一个类可以创建多个对象实例
  4. 除了封装的实例的属性和方法,类对象还可以拥有自己的属性和方法
  5. 通过类名.的方式访问类的属性/类的方法

三、类属性的定义及使用

[1]定义

在类中直接使用赋值语句即可,同时类属性是被所有的类所创建出来的对象(实例)以及类对象所共有的,可以参考此博主的博文

[2]应用

通常记录的是和类相关的特征

[3]在类方法外部访问类属性的语法

1.语法

类名.类属性名
实例名.类属性(不推荐使用)

2. 注意:

  • 如果使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值,但是一定要注意如果两个类属性和实例属性重名的话会覆盖类属性
  • python的属性查找机制
    在这里插入图片描述

3. 例子:

class Tool(object):

    # 类属性的定义是利用赋值语句进行定义的,记录的是类的一个特征
    count = 0

    def __init__(self,name):
        self.name = name

        # 让类属性的值+1
        Tool.count += 1

# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")


tool1.count = 8 #创建一个实例属性和类属性同名,则会覆盖类属性的值
print(tool1.count)
# 输出工具对象的总数
print(Tool.count)

在这里插入图片描述

[4]类属性的例子

class Human(object):

    string = "I am a string" #定义一个类属性,是一个字符串类型
    num = 0 #定义一个类属性来记录人的总数

    def __init__(self, name, age, sex):
        self.dict = {"name":name,
                     "age":age,
                     "sex":sex}

        #让类属性加+1
        Human.num += 1


    def print_message(self):
        for i in self.dict:
            print(str(i)+ ":"+str(self.dict[i]),end="  ")
        print()


xiaoming = Human("小明",18,"男")
xiaoming.print_message()

xiaohua = Human("小花",18,"女")
xiaohua.print_message()

print(Human.string) #在函数外部访问类属性
print("现在有%d人" % Human.num)  #访问在类的外部类属性

四、类方法和静态方法

1.类方法

[1]类属性
1. 说明
  1. 类属性 是针对 类对象 定义的属性
    使用 赋值语句 在 class 关键字下方可以定义类属性
    类属性 用于记录 与这个类相关 的特征
  2. 类方法就是针对类对象 定义的方法
  3. 在类方法内部可以直接访问类属性或者调用其他的类方法
2.语法
@classmethod
def 类名(cls):
	代码块

注释:
1.@classmethond这个装饰器告诉python此方法是一个类方法
2. cls和self在类中的作用是一样的
3. 同时由哪一个类调用,cls就是哪一个类

[2]在类方法外部访问类方法的语法
类名.方法(参数表)
[3]例子
class Human(object):

    string = "I am a string" #定义一个类属性,是一个字符串类型
    num = 0 #定义一个类属性来记录人的总数

    def __init__(self, name, age, sex):
        self.dict = {"name":name,
                     "age":age,
                     "sex":sex}

        #让类属性加+1
        Human.num += 1

    @classmethod #定义类方法
    def show_people_num(cls):
        print("我们现在一共有%d个人" % cls.num) #在类方法的内部访问类的属性

    def print_message(self):
        for i in self.dict:
            print(str(i)+ ":"+str(self.dict[i]),end="  ")
        print()



xiaoming = Human("小明",18,"男")
xiaoming.print_message()

xiaohua = Human("小花",18,"女")
xiaohua.print_message()

print("现在访问的是类属性:"+Human.string) #在函数外部访问类属性
Human.show_people_num() #在函数外部调用类方法

2.静态方法

[1]应用场景

在开发时,如果需要在类中封装一个方法,这个方法:
不需要 访问 实例属性 或者调用实例方法
不需要 访问 类属性 或者调用类方法
这个时候,可以把这个方法封装成一个 静态方法

[2]语法
class Dog(object):

    @staticmethod
    def run():

        # 不访问实例属性也不需要访问类属性的时候就可以利用静态方法了
        print("跑步")

# 静态方法的引用: 类名.静态方法名
Dog.run()

注意:
静态方法的引用: 类名.静态方法名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值