cccyyys 发表于 2021-6-24 10:21

【笔记】类对象、类属性和类方法与和静态方法

类对象
类对象的定义格式“class 类名:",当解释器执行class语句时,就会创建一个类对象。
class Student:
    def __init__(self,name,score):
      self.name = name
      self.score = score

    def say_score(self):
      print('{0}的分数为:{1}'.format(self.name,self.score))

print(id(Student))
print(type(Student))

s1 = Student
s2 = s1('cys',80).say_score()
Student('cys',80).say_score()
执行结果为:2876958655504
<class 'type'>
cys的分数为:80
cys的分数为:80
在Python中,一切皆对象,所以类也是一个对象,称之为“类对象”,我们可以看到,类对象的类型是“type”,而且我们通过赋值把这个类赋值给s1,用s1调用和直接使用类名调用产生的结果是一样的。
类属性
和实例属性相同,类属性是从属于类对象的,可以被所以实例对象共享。
类属性的定义方式:
class 类名:
    类变量名 = 初始值
class Student:
    company = 'SXT'#类属性
    count = 0#类属性

    def __init__(self,name,score):
      self.name = name   #实例属性
      self.score = score
      Student.count += 1
    def say_score(self):#实例方法
      print('我的公司是:',Student.company)
      print(self.name,'的分数是:',self.score)

s1 = Student('cys',80)
s1.say_score()
print('一共创建了{0}个Student对象'.format(Student.count))
运行结果为:我的公司是: SXT
cys 的分数是: 80
一共创建了1个Student对象
内存分析:当解释器执行class语句时,内存中会生成一个类对象,类对象中保存着“company”和“count”两个类属性,还有say_score()方法的信息,使用__new__()方法构造一个新的实例对象,并使用__init__()方法将该实例属性初始化,并保存有“name”和“score”两个实例属性,say_score()方法是直接从类中共享的,当s1 = Student('cys',80)时,解释器会先把“cys”和80两个对象跟别传递给“name”和“score”,然后将Student类赋值给s1,当s1.say_score()时,系统解释器会调用Student类中的say_score()方法,并打印出结果。
类方法与静态方法
类方法是从属于类对象的方法。类方法通过@classmethod来定义,格式如下:
@classmethod
def 类方法名(cls[,形参列表])
要点如下:
1、@classmethod必须位于方法上面一行
2、第一个cls必须要:cls指的是类对象本身;
3、调用类方法格式:“类名.类方法名(参数列表)”。参数列表中,不需要也不能给cls传参。
4、类方法在访问实例属性和实例方法会导致错误;
5、子类继承父类方法时,传入cls时子类对象,二非父类对象
class Student:
    company = 'SXT'

    @classmethod
    def printCopany(cls):
      print(cls.company)
Student.printCopany()
这是一个简单的类方法,注意类方法在访问实例属性和实例方法会导致错误。
静态方法
Python中允许定义与“类对象”无关的方法,称为“静态方法”。
静态方法通过装饰器@staticmethod来定义,格式如下:
@staticmethod

def 静态方法名([形参列表])
    函数体
要点如下:
1、@staticmethod必须位于方法上面一行;
2、调用静态方法格式:“类名.静态方法名(参数列表)”;
3、静态方法中访问实例属性和实例方法会导致错误。
class Student2:
    company = 'SXT'

    @staticmethod
    def add(a,b):
      print('{0}+{1}={2}'.format(a,b,a+b))
Student2.add(3,4)
运行结果为:3+4=7
这是一个简单的静态方法,静态方法中的内容可以完全与类无关,而且静态方法中可以调用类属性,但是不能调用实例属性和实例方法,类方法同样。

yijiuxiaole 发表于 2021-6-24 20:07

感谢分享 正在学习到这呢
页: [1]
查看完整版本: 【笔记】类对象、类属性和类方法与和静态方法