Python高级部分:面向对象

来源于:《Python3入门与进阶第九章》
面向对象编程入口

这一节的提纲:
在这里插入图片描述
问题一:什么是类?什么是对象?

类是现实世界或思维世界中的实体在计算机中的反映
它将数据以及这些数据上的操作封装在一起

类是抽象的,对象是具体的。

类由数据成员(刻画特征)和方法(刻画行为)组成

类实例化后,才是一个具体的对象。类就像模板(画笔 )一样,能够产生很多对象。

类负责定义和刻画,不负责执行

类最基本的作用:封装

问题二:方法和函数的区别?

方法:设计层面,
函数:程序运行,过程式的一种称谓

问题三:什么是构造函数?
构造函数__init__(),可以看做是特殊的实例方法,行为和普通的实例方法几乎一样。

#区别1:调用方式不同,通过类调用构造函数。通过实例对象调用普通的实例方法

student1 = Student('石敢当',18)   #实例化后,程序自动调用构造函数__init__()
student2 = Student('喜小乐',19)
student1.do_homework()       #通过实例对象
student2.do_homework()

#区别2:
#实例方法是用来描述类的行为,构造函数的意义在初始化类的各种特征

问题四:什么是类变量和实例变量?

类变量是和类相关联在一起的
实例变量和对象相关联在一起的

#对象的查找机制
__dict__  #是一个字典,字典里面保存着当前对象所有的相关的变量

self与实例方法
1.定义实例方法时self必须出现
2.调用实例方法时不需要对self实际传参数

#实例方法是实例中可以调用的方法。最大的特点,第一个参数传入self
 def do_homework(self):
        print('homework')
def __init__(self,name,age):
        self.name = name  #实例变量
        self.age = age
#         print('student') 

def do_homework(self):
        print('homework')

self是和对象有关,和类是无关的。谁调用了这个方法,self就指代谁。换句话说,self代表的是实例,而不是类

def do_homework(self):
        print('homework')
student1 = Student('石敢当',18)   #实例化后,程序自动调用构造函数__init__()
student2 = Student('喜小乐',19)
student1.do_homework()
student2.do_homework()

问题:实例方法中如何访问类变量?
1.通过类名.变量名 print(Student.sum1)
2.通过self访问内置函数 print(self.__class__.sum1)
在这里插入图片描述
类方法classmethod

#问题:如何区分实例方法与类方法?
#看上面是否有装饰器@
#类方法主要作用:操作和类相关的一些变量

#在函数上面增加classmethod,就成为一个类方法
@classmethod             #classmethod类方法
def plus_sum(cls):       #cls就是class缩写。cls就是类本身
        pass

#类方法可以操作类变量也可以操作实例变量,就像实例方法可以操作实力变量和类变量。
但最好还是各司其职。

静态方法

@staticmethod    #静态方法
def add(x,y):
    print('this is a static method')
    
student1.add(1,2)    #静态方法被对象调用
Student.add(1,2)     #静态方法被类调用

在这里插入图片描述
成员可见性 变量和方法的可见性

#人人都可以访问类方法,导致了类的不安全性
#公开的public  私有的 private
#其他语言中使用关键字:
public sum        #表示sum是共有的
private  sum      #表示sum是私有的

python中私有变量与私有方法

__marking     #前面有双下划线,表示私有化了,无法从外部调用私有方法。注意不要前后都加!!

最后一大节所有程序的笔记

class Student():   #建议类名首字母大写
    name = 'qiyue'      #定义变量  #全局变量  #数据成员刻画特征  #类变量
    age = 0
    
    def __init__(self,name,age):
        #构造函数    __init__() should return None,not 'str'  只能返回None
        #初始化对象的属性
        self.name = name  #实例变量
        self.age = age
#         print('student')
    
    def do_homework(self):
        print('homework')
         
            
                
#     def print_file(self):    #不需要任何参数,也要写上self    #类下面的函数一定要加self,否则是要报错的  
#         print('name:' + self.name)      #变量要通过self.操作符来引用
#         print('age:' + str(self.age))
#            pass             #占位符
    
    
# class StudentHomework():
#     homework_name = ''

# class Printer():
    
# student1 = Student()       #类名加括号,完成实例化
# student2 = Student()
# student3 = Student()

# print(id(student1))
# print(id(student2))
# print(id(student3))      #结果表明student1,student2,student3地址不一样
# student.print_file()      #调用类下面的方法,而不是类下面的函数,一会讨论
student1 = Student('石敢当',18)   #实例化后,程序自动调用构造函数__init__()
student2 = Student('喜小乐',19)
student1.do_homework()
student2.do_homework()
# print(student1.name)
# print(student2.name)
# print(Student.name)
print(Student.__dict__)    #字典,打印出对象里包含的所有的元素、。。可用于检查对象里的元素
# a = student1.__init__()
# print(a)
# print(type(a))
 
    
@classmethod             #@装饰器, classmethod类方法
def plus_sum(cls):
        pass
@staticmethod    #静态方法
def add(x,y):
    print('this is a static method')
    
student1.add(1,2)    #静态方法被对象调用
Student.add(1,2)     #静态方法被类调用


猜你喜欢

转载自blog.csdn.net/weixin_42610407/article/details/86677811
今日推荐