Python面向对象编程(二)

1.类变量

类变量是类的属性,此属性属于类,不属于此类的实例

1.1 作用: 通常用来存储该类创建对象的共有属性

1.2 说明:

类变量可以通过该类直接访问
类变量可以通过该类的实例对象直接访问
类变量可以通过此类的对象的__class__属性间接访问

1.3 示例

class Human():
    total_count = 0     # 类变量,用来记录Human对象的个数
    pass
# 类变量可以通过该类直接访问
print(Human.total_count)    # 访问类变量
# 类变量可以通过该类的实例对象直接访问
h1 = Human()
print(h1.total_count)       # 借助该类的实例访问类变量(属性)
h1.total_count = 100        # 这一步为实例添加实例属性
print(h1.total_count)
print(Human.total_count)    # 实例对象不能改变类变量
# 类变量可以通过此类的对象的__class__属性间接访问
h1.__class__.total_count +=1    # 等同于 Human.total_count += 1
print(Human.total_count)

输出如下

0
0
100
0
1

示例 2

# 此类示意用类变量记录Human对象的个数
class Human:
    total_count = 0         # 类变量,用来记录Human对象的个数
    def __init__(self,n):
        self.name = n
        self.__class__.total_count +=1
        print(n,"对象被创建")
    def __del__(self):
        print(self.name,'对象被销毁')
        self.__class__.total_count-=1
L = []
L.append(Human('张飞'))
L.append(Human('关羽'))
print('当前人物个数是',Human.total_count)
del L[1]

输出如下

张飞 对象被创建
关羽 对象被创建
当前人物个数是 2
关羽 对象被销毁
张飞 对象被销毁

2.类的文档字符串

类内第一个没有赋值给任何变量的字符串为类的文档字符串
类的文档字符串可以通过help()函数查看
类的文档字符串绑定在类的__doc__属性上

3.类的 slots 列表

3.1 作用:

限定一个类创建的实例只能有固有的属性(实例变量)
不允许对象添加列表以外的实例属性(实例变量)
防止因为用户写错属性名二发生程序错误

3.2 说明

	__slots__属性绑定一个字符串列表
	含有__slots__属性的类多创建的实例对象没有__dict__属性,即此实例不用字典来存储对象的实例属性

3.3 示例

class Human:
    __slots__ = ['name','age']      ##
    def __init__(self,n,a):
        self.name = n
        self.age = a
    def info(self):
        print(self.name,"今年",self.age,"岁")
h1 = Human('小张',8)
h1.info()
h1.age = 9
# h1.Age = 10 #没有 __slots__属性的情况下,添加实例变量属性   # 此处会出错 因为__slots__ 属性
h1.info()

输出如下

小张 今年 8 岁
小张 今年 9 岁

4.类方法 @classmethod

类方法适用于描述类的行为的方法,类方法属于类,不属于类的实例对象

4.1 说明:

类方法需要使用@classmethod 装饰器定义
类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls'
类和该类的实例都可以调用类方法
类方法不能访问此类创建的对象的实例属性

4.2 示例

class A:
    v = 0   # 类变量

# 类方法需要使用@classmethod 装饰器定义
# 类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls'
    @classmethod
    def get_v(cls):
        return cls.v    # 用cls.v访问类变量v

    @classmethod
    def set_v(cls,v):
        cls.v = v

print('A.v=',A.get_v())
A.set_v(100)
print('A.v=',A.get_v())

A.v = 200           # 不建议直接操作类变量,应该用方法
print('A.v=',A.get_v())

# 类和该类的实例都可以调用类方法
a = A()
print(a.get_v())
a.set_v(200)
print(a.get_v())

输出如下

A.v= 0
A.v= 100
A.v= 200
200
200

示例2

# 类方法不能访问此类创建的对象的实例属性
class A:
    v = 0   # 类变量

    @classmethod
    def set_v(cls,v):
        '''请问此方法能否访问a.color属性?'''
        cls.v = v
        # print(cls.color)    # 出错!  type object 'A' has no attribute 'color'

    def get_myshuxing(self):    # 实例方法,可以
        print(self.color)
a = A()
a.color = '#FF0000'
a.set_v(100)
a.get_myshuxing()		

输出

#FF0000

5.静态方法 @staticmethod

静态方法是定义在类内部的函数,此函数的作用域时类的内部

5.1 说明:

静态方法需要使用@staticmethod 装饰器定义
静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数	# 功能上,就是普通函数
静态方法只能凭借该类或类创建的实例调用
静态方法不能访问类变量和实例变量

5.2 示例

# 此示例示意静态方法的定义和使用
class A:
    @staticmethod
    def myadd(a,b):
        return a+b
print(A.myadd(100,200))     # 300
a = A()
print(a.myadd(300,400))     # 700
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值