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__: 乘方