类属性:类中,方法外定义的属性。可通过类名和对象名访问
实例属性:类中,方法中定义的属性。只能通过对象名访问。
类属性和实例属性是两种单独的属性,类属性的调用方法:类名.属性名,没有同名实例属性时也可self.属性名调用。实例属性的调用方法:类内部:self.属性名,类外部:对象名.属性名。
即使两个属性的命名相同,也是毫无关系的两个属性。
class Student():
name = '无名氏'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
pass
pass
def __str__(self):
return '姓名:类属性:{},实例属性:{},年龄:{},性别:{}'.format(Student.name,self.name,self.age,self.sex)
student1 = Student('Nick',22,'man')
print(student1)
print('student1对象的name:{}'.format(student1.name)+'\n'+'student1对象的age:{}'.format(student1.age))
print('Student类的name:{}'.format(student1.name))
#print('Student类的age:{}'.format(Student.age))#报错
输出:
姓名:类属性:无名氏,实例属性:Nick,年龄:22,性别:man
student1对象的name:Nick
student1对象的age:22
Student类的name:Nick
类方法:
类所拥有的方法,需要用装饰器@classmethord来标识为类方法,第一个参数一般命名为cls。
类方法可以通过类名和对象名来调用
class Student():
name = '无名氏'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
pass
pass
@classmethod
def get_name(cls):
return cls.name
@classmethod
def set_name(cls,name):
cls.name = name
pass
student1 = Student('Nick',22,'man')
print('student1.name():{}'.format(student1.name))
print('Student.name():{}'.format(Student.name))
print('student1.get_name():{}'.format(student1.get_name()))
student1.set_name('Andy')
print('student1.get_name():{}'.format(student1.get_name()))
print('Student.get_name():{}'.format(Student.get_name()))
student1.name():Nick
Student.name():无名氏
student1.get_name():无名氏
student1.get_name():Andy
Student.get_name():Andy
静态方法:
1、类拥有的方法,需要用@staticmethord来标识静态方法,静态方法必须有的参数。
2、一般情况下不会通过对象来访问静态方法。
3、静态方法主要存放逻辑性的代码,和类以及对象没有交互,在静态方法中不会涉及到类中方法和属性的操作。
4、不用创建对象,节约资源
import time
class TimeTest():
def __init__(self,hour,min,second):
self.hour = hour
self.min = min
self.second = second
pass
@staticmethod
def getTime():
return time.strftime("%H:%M:%S",time.localtime())
pass
pass
print(TimeTest.getTime())
10:19:32