面向对象的Python实现

#类的创建
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/上学习的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值