Python3 类的属性有实例属性与类属性,类的方法有普通方法,类方法,静态方法。
类对象:类名
实例对象:类创建的对象
Python3 类的属性
尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。
实例属性在每创造一个实例时都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同,这样减少内存的使用。
1. 实例属性
一般在__init__(self,...)函数中初始化
内部调用时都需要加上self.propertyname,外部调用时用instancename.propertyname
2: 类属性
在__init__()外初始化
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,类似C++、Java中类的静态成员变量。
对于公有的类属性,在类外能通过类对象和实例对象访问
在内部用classname.propertyname(类属性名)调用
外部既能用classname.propertyname又能用instancename.propertyname来调用
3. 私有属性
1)单下划线_开头:只表示这是私有属性,外部依然能访问更改
2)双下划线__开头:不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
实际将其转化为了_classname__propertyname
如果在类的外部修改类属性,须通过类对象(类名)去引用然后进行修改。
如果通过实例对象去引用类属性,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性。
如果通过实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
classLesson(object):
student = "you"#公有的类属性__nu = 2#私有的类属性#对象的构造方法(初始化)方法def__init__(self, name, score):
self.name = name #公有的类实例属性self.score = score #公有的类实例属性defprint_score(this):
print('%s: %s'% (this.name, this.score))
#实例化对象lesson1 = Lesson('python', 90)
#实例对象引用类属性时,会产生一个同名的实例属性print(lesson1.student) #正确,输出youprint(Lesson.student) #正确,输出you#print(lesson1.__nu) #错误 不能在类外通过实例对象访问私有的类属性#print(Lesson.__nu) #错误 不能在类外通过类对象访问私有的类属性print(lesson1.name) #正确,输出python#print(Lesson.age) #错误 实例属性,不能通过类对象调用lesson1.student = 'java'#修改的是实例属性的,不会影响类属性print(lesson1.student) #正确,输出javaprint(Lesson.student) #正确,输出youdellesson1.student #删除之后,仍能打印print(lesson1.student) #正确,输出you
特殊的类属性
对于所有的类,都有一组特殊的属性:
__name__类的名字(字符串)
__doc__类的文档字符串
__bases__类的所有父类组成的元组
__dict__ 类的属性组成的字典
__module__ 类所属的模块
__class__类对象的类型
Python3 类的方法
普通类方法:
def fun_name(self,...):
pass
在外部用类的实例对象进行调用
静态方法:@staticmethod
不能访问实例属性,参数不能传入self。与类相关但是不依赖类与实例的方法。
classLesson(object):
student = "you"#公有的类属性__nu = 2#私有的类属性#对象的构造方法(初始化)方法def__init__(self, name, score):
self.name = name #公有的类实例属性self.score = score #公有的类实例属性@staticmethoddefprint_score():
print('%s : %s'% (Lesson.student,Lesson.__nu))
#实例化对象lesson1 = Lesson('python', 90)
Lesson.print_score() #类对象调用类静态方法lesson1.print_score() #实例对象调用类静态方法
类方法:@classmethod
不能访问实例属性, 参数必须传入cls。当然也能用其他名称的变量作为其第一个参数,习惯使用'cls'了。
必须传入cls参数(cls代表了此类对象,self代表实例对象),并且用此来调用类属性:cls.类属性名。
静态方法与类方法都能通过类或者实例对象来调用。它们都不能调用实例属性。
classLesson(object):
student = "you"#公有的类属性__nu = 2#私有的类属性#对象的构造方法(初始化)方法def__init__(self, name, score):
self.name = name #公有的类实例属性self.score = score #公有的类实例属性@classmethoddefprint_score(cls):
print('%s'% (cls.student))
print('%s'% (cls.name)) #错误,静态方法不能调用实例属性#实例化对象lesson1 = Lesson('python', 90)
Lesson.print_score() #类对象调用类方法lesson1.print_score() #实例对象调用类方法
类方法有一个用途就是对类属性进行修改。
classLesson(object):
student = "you"#公有的类属性__nu = 2#私有的类属性#对象的构造方法(初始化)方法def__init__(self, name, score):
self.name = name #公有的类实例属性self.score = score #公有的类实例属性@classmethoddefsetStu(cls,student,nu):
cls.student = student
cls.__nu = nu
@classmethoddefprint_score(cls):
print('%s : %s'% (cls.student,cls.__nu))
#实例化对象lesson1 = Lesson('python', 90)
lesson1.setStu('we','6') #修改类的公有或私有属性lesson1.print_score() #实例对象调用类方法,输出we : 6
类的专有方法
__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方