面向对象的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/上学习的笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象编程是一种编程范式,它的核心思想是将程序中的数据和方法组织成对象Python是一种面向对象的编程语言,因此它支持对象、继承、多态等概念。 在Python中,定义一个需要使用关键字class,然后在中定义方法和属性,方法和属性可以是公有的或私有的。通常情况下,名应该首字母大写,方法名和属性名应该使用小写字母和下划线。 以下是一个简单的Python的例子: ``` class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print("Hello, my name is {} and I am {} years old.".format(self.name, self.age)) ``` 在上面的例子中,我们定义了一个Person,它有两个属性name和age,还有一个方法say_hello,这个方法用来输出问候语。__init__方法是一个特殊的方法,用来初始化对象的属性。 创建一个对象需要使用名和括号,传入初始化方法需要的参数。例如: ``` person = Person("Tom", 25) ``` 上面的代码创建了一个Person对象,名字是Tom,年龄是25。调用对象方法需要使用点操作符,例如: ``` person.say_hello() ``` 这会输出: ``` Hello, my name is Tom and I am 25 years old. ``` 这只是一个简单的例子,面向对象编程可以更加复杂和强大,可以实现很多有趣的功能。在Python中,也有许多内置的和模块,可以帮助我们更方便地进行面向对象编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值