类对象
类对象的定义格式 “class 类名:",当解释器执行class语句时,就会创建一个类对象。
[Python] 纯文本查看 复制代码 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 类名:
类变量名 = 初始值
[Python] 纯文本查看 复制代码 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时子类对象,二非父类对象
[Python] 纯文本查看 复制代码 class Student:
company = 'SXT'
@classmethod
def printCopany(cls):
print(cls.company)
Student.printCopany()
这是一个简单的类方法,注意类方法在访问实例属性和实例方法会导致错误。
静态方法
Python中允许定义与“类对象”无关的方法,称为“静态方法”。
静态方法通过装饰器@staticmethod来定义,格式如下:
@staticmethod
def 静态方法名([形参列表])
函数体
要点如下:
1、@staticmethod必须位于方法上面一行;
2、调用静态方法格式:“类名.静态方法名(参数列表)”;
3、静态方法中访问实例属性和实例方法会导致错误。
[Python] 纯文本查看 复制代码 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
这是一个简单的静态方法,静态方法中的内容可以完全与类无关,而且静态方法中可以调用类属性,但是不能调用实例属性和实例方法,类方法同样。 |