小白学python日志(07)-面向对象(初步)

今天上课的内容首先是把第五章中函数的最后两个用法介绍了一下,然后就开展了今天比较难而且全程走神状态的对象,真是是非常不好理解,也不知道是困了还是听不明白,反正对象这一块很多专有的名词都不是很好记,导致我都不理解其中各种名词的基本用法和区别。

第五章最后的函数是nonlocal关键词:这个用来声明外层的局部变量和前面提到的global是用来声明全局变量的,可以对比记忆。

#测试nonlocal\gobal关键词的用法
a = 100
def outer():
    b=10
    def inner():
        nonlocal  b #声明外部函数的局部变量
        print("inner b:",b)
        b = 20
        global a
        a=1000
    inner()
    print("outer b:",b)
outer()
print("a:",a)

代码跟着老师敲了一遍,但是不是很明白其中的区别,先这样练习,后面再不断回顾一下。

接着就是LEGB:这个是用来做规则查找的,优先顺序为:local-enclosed-global-built in,分别是函数或是类方法内部、嵌套函数、全局变量、为自己保留的特殊名称。再找不到名称的时候就会出现NameError。

#测试LEGB
print(type(str))
#str = "global str"
def outer():
    #str = "outer"
    def inner():
        #str = "inner"
        print(str)

    inner()
outer()

    这是第五章函数的内容,但是后面的习题我感觉我大部分都独立做不了,感觉很多都是学习过的,但是想不到每一步的内容,之前学习的内容根本联系不起来,需要进一步回顾复习。

第六章讲的是对象,我觉得比较难以理解,就是汉字我都认识,但是组合一块就不知道什么意思了,面向对象是编程的思想主要是针对大型软件设计来的,可以使得程序扩展性更强、可读性更好、变得更加简单一些。在python中一切皆是对象。

课上老师介绍了面向对象与面向过程的区别,举了很生动形象的例子,大致是可以理解两者的区别与联系的。这两种思维也是我们生活中会经常用的,所以这个一块还是相对好理解的。,不需要解释太多的内容,重点是接下来的内容,比较难理解一些。

针对对象的进化来说,随着编程面临的问题越来越复杂,编程语言也是在进化,主要从最简单的数据开始,再到数据变成数组,再到后面的出现“结构体”;数据处理的方式和逻辑变得复杂,也就衍生出了“对象”一词,从数据到数组再到结构体最后再到对象。

接着讲了类的定义:我们把对象比作是一个饼干,类就是制造饼干的模具,但是模具其实就是对象,称为类对象;类的实例称为实例对象。通过定义数据类型的属性和方法,类将行为和状态进行打包;对象是类的具体实体,称为类的实例,从一个类创建对象时,每个对象都会共享这个类的行为(方法),但是每个对象都有自己的属性值(数据值),总结来说就是方法代码是共享的,但是属性数据是不共享的。

class Student:   #类名一般首字母大学,多个单词采用驼峰原则
    def __init__(self,name,score):
        self.name = name
        self.score = score
    def say_score(self):     #self必须位于第一个参数
        print("{0}的分数是:{1}".format(self.name,self.score))


s1 = Student("赵航",18) #通过类名来调用构造函数
s1.say_score()

这是类的基本应用,可以大致了解一下,但是依旧是会跟着写代码,老师讲的时候还能勉强理解,但是自己看的时候还是不好理解。

接着就是__init__构造方法和__new__方法:类是抽象的,称为是“对象的模板”,需要通过这个模板来创建类的实例对象,然后才能使用类定义的功能。上面说到对象的值value,这个值其实包括属性和方法。在进行使用构造函数__init__()方法时,构造方法适用于执行“实例对象的初始化工作”即对象构建后,初始化当前对象相关属性,无返回值。使用的时候需要注意:1、名称固定;2、第一个参数固定,必须为:self;3、构造函数通常用来初始化实例对象的实例属性;4、通过“类名(参数列表)”来调用构造函数,调用后,将创建好的对象返回给相应的变量;5、初始化创建好的对象,初始化时指“给实例属性赋值”;6、无需重新定义该方法;7、如果不定义构造函数,系统会提供一个默认函数,若是提供则系统不会创建构造函数。这3、4两条不是很好理解。

关于实例属性和实例方法:实例属性:就是从属于实例的属性,也称为实例变量;代码的定义为:self.实例属性名=初始值;self.实例属性名;obj01 = 类名()或是obj01.实例属性名 = 值。实例方法:从属于实例对象的方法:def 方法名(self [,形参列表]):函数体;放啊的调用格式为:对象.方法名([实参列表])。函数和方法的区别:1、都是用来完成一个功能的语句块,本质一样;2、方法调用时通过对象调用,方法从属于时特定实例对象,普通函数没有这个特点;3、直观上方法定义需要传递self,但是函数不需要。

接着讲述了类对象、类属性、类方法以及静态方法:

类对象,在执行class是就会创建一个类对象。

class Student:  #类对象
    pass
print(id(Student))
print(type(Student))
stu2 = Student

上述代码是类对象的基本应用

类属性:从属于类对象的属性,也称为类变量。类属性从属于类对象,可以被所有实例对象共享(不是很懂,不是属性不可以共享吗???)

class Student:
    company = "SXT" #类属性
    count = 0   #类属性
    def __init__(self,name,score):
        self.name = name      #类属性
        self.score = score
        Student.count = Student.count+1
    def say_score(self):  #实例方法
        print("我的公司是:",Student.company)
        print(self.name,'的分数是:',self.score)
s1 = Student('张三',80)         #s1是实例对象,可以自动调动__init__()方法
s1.say_score()
print('一共创建{0}个Student对象'.format(Student.count))    #还不是很懂,自己写的时候肯定会出现各种问题

类方法:从属于类对象的方法,通过装饰器@classmethod来定义。

静态方法:python中允许定义与类对象无关的方法,称为静态方法。

#测试类方法、静态方法
class Student:
    company = "SXT"   #类属性
    @classmethod
    def printCompany(cls):
        print(cls.company)
Student.printCompany()


class Student:
    company = "SXT"   #类属性
    @staticmethod
    def add(a,b):   #静态方法
        print("{0}+{1}={2}".format(a,b,(a+b)))
        return a+b
Student.add(20,30)   #这个静态方法有什么用处?弄不清楚与这些类方法之间的具体有什么区别

这个是类方法与静态方法的使用情况,虽然不是很懂什么情况,但是还是尽量去理解了,接着学下去。

随后就讲了内存分析实例对象和类对象创建过程,这个比较重要,但是以及没有听懂,我还把视频反复看了好几遍,以及模糊的很。这里用的代码是和类属性的一样,老师画了流程图,一开始就没有弄明白,所以后面也是迷迷糊糊的,这里不再放太多内容了。

今天学习的最后两个内容就是__del__方法也称为析构函数,就是用来实现对象被销毁时岁需要的操作,释放对象占用的资源。

#析构方法测试
class Person:
     def __del__(self):
         print("销毁对象{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")

然后是__call__方法的对象,称为可调用对象,即该对象可以像函数一样被调用:

#测试可调用方法
class SalayAccount:

    def __call__(self, salary):
        print("算工资...")
        yearSalary = salary*12
        daySalary = salary//22.5
        hourSalary = daySalary//8
        return dict(yearSalary=yearSalary,monthSalary=salary,daySalary=daySalary,hourSalary=hourSalary)
s = SalayAccount()
print(s(300000))

以上就是今天学习的所有内容,总体评价一下就是有点难受,很多内容没有听明白,需要进一步的学习,并且不断前面的内容多用一下。跟着老师先把代码敲了一遍,然后努力跟着老师的节奏。加油!

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值