首页 > Python3教程 > Python3类与面向对象

Python3 类的属性与方法

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

如果在类的外部修改类属性,须通过类对象(类名)去引用然后进行修改。

如果通过实例对象去引用类属性,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性。

如果通过实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

class Lesson(object):
student = "you" # 公有的类属性
__nu = 2 # 私有的类属性

# 对象的构造方法(初始化)方法
def __init__(self, name, score):
self.name = name # 公有的类实例属性
self.score = score # 公有的类实例属性

def print_score(this):
print('%s: %s' % (this.name, this.score))

# 实例化对象
lesson1 = Lesson('python', 90)

#实例对象引用类属性时,会产生一个同名的实例属性
print(lesson1.student) #正确,输出you
print(Lesson.student) #正确,输出you
#print(lesson1.__nu) #错误 不能在类外通过实例对象访问私有的类属性
#print(Lesson.__nu) #错误 不能在类外通过类对象访问私有的类属性

print(lesson1.name) #正确,输出python
#print(Lesson.age) #错误 实例属性,不能通过类对象调用

lesson1.student = 'java' #修改的是实例属性的,不会影响类属性
print(lesson1.student) #正确,输出java
print(Lesson.student) #正确,输出you

del lesson1.student #删除之后,仍能打印
print(lesson1.student) #正确,输出you

Python3 类的属性与方法

 

特殊的类属性

对于所有的类,都有一组特殊的属性:

__name__ 类的名字(字符串)

__doc__ 类的文档字符串

__bases__ 类的所有父类组成的元组

__dict__   类的属性组成的字典

__module__   类所属的模块

__class__ 类对象的类型

 

Python3 类的方法

普通类方法:

 def fun_name(self,...):

  pass

在外部用类的实例对象进行调用

静态方法:@staticmethod            

不能访问实例属性,参数不能传入self。与类相关但是不依赖类与实例的方法。

class Lesson(object):
student = "you" # 公有的类属性
__nu = 2 # 私有的类属性

# 对象的构造方法(初始化)方法
def __init__(self, name, score):
self.name = name # 公有的类实例属性
self.score = score # 公有的类实例属性

@staticmethod
def print_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.类属性名。

静态方法与类方法都能通过类或者实例对象来调用。它们都不能调用实例属性。

class Lesson(object):
student = "you" # 公有的类属性
__nu = 2 # 私有的类属性

# 对象的构造方法(初始化)方法
def __init__(self, name, score):
self.name = name # 公有的类实例属性
self.score = score # 公有的类实例属性

@classmethod
def print_score(cls):
print('%s' % (cls.student))
print('%s' % (cls.name)) # 错误,静态方法不能调用实例属性

# 实例化对象
lesson1 = Lesson('python', 90)

Lesson.print_score() #类对象调用类方法
lesson1.print_score() #实例对象调用类方法

类方法有一个用途就是对类属性进行修改。 

class Lesson(object):
student = "you" # 公有的类属性
__nu = 2 # 私有的类属性

# 对象的构造方法(初始化)方法
def __init__(self, name, score):
self.name = name # 公有的类实例属性
self.score = score # 公有的类实例属性

@classmethod
def setStu(cls,student,nu):
cls.student = student
cls.__nu = nu

@classmethod
def print_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__: 乘方

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。