#类的创建 class Modle: #Modle类的名称 pass #pass避免没有实现程序报错,先列出框架 def main(): modle = Modle() # 小括号是调用 print(modle) if __name__== '__main__': main()
Output:
class Modle: name = "CNN" #类里面定义的name,块体内局部作用域属于类 def main(): print(Modle.name) #类的name modle = Modle() print(modle.name) #先搜索对象的作用域的name,如果没有则向上找它所属的类的name modle.name = "RNN" #对象的作用域 print(Modle.name) print(modle.name) if __name__== '__main__': main()
Output:
要点:
1、类定义体中,可以定义自己的属性,并通过.来引用
2、类实例化出对象以后,创建新的作用域,也就是对象自己的作用域
3、对实例化出的对象引用属性时,先从自己的作用域找,未找到则向上找(Local-->Enclosed-->Global-->Built_in),这里是类的作用域
4、实例化出来的对象是可以在运行时绑定数据的
#分开读和写:读的时候一层层向上找;写的时候只看自己的作用域,自己有没有的话直接创建
#类的自定义实例化:__init__() class Modle: name = "DNN" def __init__(self,name): #函数定义,冒号是进入下一个子块 self.name = name def main(): cnnmodle = Modle("CNN") #初始化实体 rnnmodle = Modle("RNN") print(Modle.name,cnnmodle.name,rnnmodle.name) cnnmodle.name,rnnmodle.name = "RNN", "CNN" print(Modle.name,cnnmodle.name,rnnmodle.name) if __name__== '__main__': main()
Output:
要点:
1、类定义体中,self指代实例化出来的对象,想要把某些东西绑定在初始化对象里面需要使用self
2、没有跟在self后面的属性属于类属性
3、可以使用__init__()函数定义初始化方式
4、隶属于类的方法是共享的,隶属于对象的方式是每个类私有的(如上面的Modle.name是共享的)
类的方法(method)
class Modle: name = "DNN" def __init__(self,name): self.name = name def print_name(self):#method 这个self是针对对象的,它是必须的,否则报错 print(self.name) def main(): cnnmodle = Modle("CNN") cnnmodle.print_name() cnnmodle.name = "RNN" cnnmodle.print_name() if __name__== '__main__': main()
Output:
要点:
1、类定义体中的方法默认情况下隶属对象,而非类本身
2、直接在类上调用方法时会报错
对象的self省略报错
cnnmodle.print_name() 等价于 Modle.print_name(cnnmodle)
实际上执行的是Modle.print_name(cnnmodle)
class Modle:
name = "DNN"
def __init__(self, name):
self.name = name
def print_name(self):
print(self.name)
@classmethod #装饰器
def print_cls_name(cls):
print(cls.name)
def main():
Modle.print_cls_name()
cnnmodle = Modle("CNN")
cnnmodle.print_name()
cnnmodle.name = "RNN"
cnnmodle.print_name()
Modle.print_cls_name()
if __name__ == '__main__':
main()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Modle:
__name = "DNN"
def __init__(self, name):
self.__name = name
def print_name(self): # method 这个self是针对对象的,它是必须的,否则报错
print(self.__name)
# 使用@classmethod与cls可以绑定到类本身上,这样类就可以不用初始化就可以直接调用了,
# 有时候需要把一组函数(一组功能)都放在一起,它们彼此之间都有共同的作用对象它们不需要实例化
# 数据可以绑定到类上也可以绑定到对象上
@classmethod #装饰器
def print_cls_name(cls):
print(cls.__name)
def main():
Modle.print_cls_name()
cnnmodle = Modle("CNN")
cnnmodle.print_name()
cnnmodle.name = "RNN"
print(Modle.__name)
if __name__ == '__main__':
main()
# 1、通过双下划线开头,可以将数据私有化,对于方法一样适用
# 2、从报错信息可以看出,Modle是一个tpye object,cnnmodle是一个Modle object
Python中的私有化是假的,本质上是做一次名称替换,因此实际中也有为了方便调试而使用单下划线的情况,而私有化完全靠自觉了。
在github的代码中大量单下划线开头的函数和变量,仅仅是通过单下划线告诉我们它是内部使用的,不要在外部使用
以上内容为博主在http://sigai.cn/上学习的笔记