Python3 类的定义和对象实例
面向对象设计思想最重要的概念就是类(Class)和实例(Instance),类是抽象的模板。
实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
类定义
在Python中,定义类是通过class关键字,语法格式如下:
class ClassName:
<statement-1>
<statement-N>
class关键字后面紧接着是类名,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。
通常,如果没有合适的继承类,就使用object类,所有类都继承object类。
class Lesson(object):
# 对象的构造方法(初始化)方法
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
# 实例化对象
lesson1 = Lesson('python', 90)
lesson2 = Lesson('java', 99)
print(lesson1) # <__main__.Lesson object at 0x000001B39B1CC501>
print(lesson2) # <__main__.Lesson object at 0x000001B39B1CCA90>
print(Lesson) # <class '__main__.Lesson'>
lesson2.score = 91 # 对lesson2对象的属性重新赋值
lesson2.print_score()
对象实例
定义好了类,就能根据类创建出该类的实例对象,创建实例是通过类名+()实现的。
上面的例子中,变量lesson1指向的是一个Lesson的实例,后面的0x000001B39B1CC501是变量的内存地址,每个实例对象的地址都不一样。
给类实例化一个对象后,就能给这个实例变量绑定属性,如给实例lesson2的score属性重新赋值。
我们从外部看Lesson类,就知道,创建该类实例需要提供name和score的值,如何打印这2个值,在Lesson类的内部定义了。
上面这个类的这些数据和处理逻辑被“封装”起来了,调用很容易,且不用知道类内部实现的细节。
封装的另一个好处是很容易给Lesson类增加新的方法。
类的初始化
特殊方法“__init__”:前后分别有两个下划线
类相当于一个模板,我们在创建实例的时候,能初始化对象里的属性。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去。
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就能初始化self的各种属性,因为self就指向创建的实例本身。
这里也能使用 this,但是最好还是按照约定是用 self。
定义了__init__方法,在创建实例的时候,就必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
与普通的函数相比,在类中定义的函数有一点不同,就是第一个参数永远是实例变量self,且在调用时,不用传递该参数。
除此之外,类的方法和普通函数没有区别,我们仍然能用默认参数、可变参数、关键字参数和命名关键字参数等。
特殊方法“__new__”
当实例化一个对象的时候,”__new__”方法首先被调用,然后是”__init__”方法。
”__new__”方法的通用格式:
def__new__(cls,*args,**kwargs):
# func_suite
returnobj
“__new__” 方法是在类实例化对象时第一个调用的方法,将返回实例对象
“__new__” 方法是类的静态方法(第一个参数为cls),即使没有被加上静态方法装饰器
第一个参数cls是当前正在实例化的类,如果要得到当前类的实例,应当在当前类中的 “__new__” 方法语句中调用当前类的父类的” __new__” 方法。
”__new__”和”__init__”的区别与联系:
“__new__”方法在Python中是真正的类构造方法(创建并返回实例),通过这个方法产生一个”cls”对应的实例对象,所以”__new__”方法一定要有返回。
”__init__”方法,是一个初始化的方法,”self”代表由类产生出来的实例对象,”__init__”将对这个对象进行相应的初始化操作。
__new__是一个静态方法,而__init__是一个实例方法。
__new__方法会返回一个创建的实例,而__init__什么都不返回。
只有在__new__返回一个cls的实例时后面的__init__才能被调用。
当创建一个新实例时调用__new__,初始化一个实例时用__init__。
class User:
def prt(self):
print(self) # <__main__.User object at 0x000002AA48AECB70>
print(self.__class__) # <class '__main__.User'>
t = User()
t.prt()
从执行结果看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
self 不是 python 关键字,我们把他换成其它字符串也能正常执行。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型