Python10高级部分:面向对象

在这里插入图片描述

Q:类

A:

what

类是将数据以及这些数据上的操作封装在一起
关键字:class
格式

class 类名称(): #类变量的定义
      变量1=...
      变量2=...
'''
构造函数:__init__函数,实例化时自动调用
构造函数不能return 字符串
构造函数的作用是让类实例化时可以传入数据
初始化对象的属性,类的特征
'''
#def前有空行
    def __init__(self,变量1,变量2):
        self.变量1=变量1
        self.变量2=变量2
            print(类名.类变量)     #内部访问类变量的方法1,与外部相同
            print(self.__class__.类变量)     #内部访问类变量的方法2
'''
类方法
在类方法中操作类变量,@classmethod是一个装饰器
不能在实例化时自动调用
cls可以随意改,但python建议使用cls
'''
#def前有空行
    @classmethod
    def 函数1(cls):      #类方法中访问类变量的方法
        cls.类变量 += 1
'''
实例方法是普通函数,定义的是实例变量,和类变量无关
在类内部的函数必须要在参数区域加入self(也可以使用this但python推荐使用this)
'''
#def前有空行
    def 函数2(self):    #在类内部的函数调用类内部的参数时要加self.
        print(self.变量1)
'''
静态方法,@staticmethod是一个装饰器
静态方法也可以调用类变量,不可以调用实例变量
不推荐使用
'''
#def前有空行
    @staticmethod
    def 函数3(x,y):  #静态方法不需要加self.
        print(类名.类变量)
how

实例化:

变量3=类名(变量4,变量5)
变量3.函数2()

在一另一个模块实例化:

from 模块1(类所在模块即文件名) import 类名
变量3=类名(变量4,变量5)
变量3.函数2()

类变量可以通过(类名.变量名)访问
类会自动出现__dict__的变量,是一个字典,当实例化一个类后,字典会自动填充数值
调用方法:

变量3=类名(变量4, 变量5)
print(变量名.__dict__)

得到{变量1:变量4, 变量2:变量5}

调用类方法、静态方法、实例方法,方法一致
但类方法尽量不使用
#构造函数:实例调用

类名.函数1()
实例名.函数1()

方法的内部调用

self.方法名()

通过方法进行实例化:有办法验证实例化输入值的正确性

class 类名称():
'''
类变量的定义
初始化对象的属性,类的特征,不可见变量不被传入
'''
#def前有空行
    def __init__(self,变量1,变量2):
        self.变量1 = 变量1
        self.变量2 = 变量2    
        self.不可见1 = 0   #不可见变量初始化

    def 函数1(self,不可见1):  #实例方法 def前有空行
        print(self.不可见1)

实例化:

变量3 = 类名(变量4,变量5)
变量3.函数1()
how much

类只负责封装不负责执行,不要在类中尝试调用
编程建议:
不建议类名称使用下划线,建议使用大写第一个字母连接命名类
应该在一个模块中写类,另一个模块调用它,尽量一个模块只写一个类
不建议使用静态方法
不建议直接使用外部实例化定义,建议都通过方法

举例1:类的定义、实例方法、实例调用
class Student():
    name = ''
    age = 0
    
    def print_file(self):
        print('name' + self.name)
        print('age'+str(self.age))

student = Student()
student.print_file()

输出
name:
age:0

举例2:实例化不同结果
class Student():3:类变量的使用
class Student():
    StudentSum = 0
    name = ''
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__class__.StudentSum += 1

    def Homework(self):
        print(self.name, self.age)

stu1 = Student('小a', 18)
stu2 = Student('小b', 19)
stu3 = Student('小c', 20)
stu4 = Student('小d', 21)
print(Student.StudentSum)

输出
4

举例3:类方法的使用
class Student():
    StudentSum = 0
    name = ''
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def Homework(self):
        print(self.name, self.age)


sut1 = Student('小明', 18)
print(sut1.age)
print(Student.StudentSum)
sut1.Homework()

输出
18
0
小明 18

举例4:在类方法中操作类变量
class Student():
    StudentSum = 0
    name = ''
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def plus_sum(cls):
        cls.StudentSum += 1

    def Homework(self):
        print(self.name, self.age)


stu1 = Student('小a', 18)
stu1.plus_sum()
stu2 = Student('小b', 19)
Student.plus_sum()
stu3 = Student('小c', 20)
stu4 = Student('小d', 21)
print(Student.StudentSum)

输出
2

举例5:实例变量的不可见性
class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__h = 0

    def Homework(self, h):
        self.__h = h
        print(self.__h)

stu1 = Student('小a', 18)
stu1.Homework(59)

输出
59

Q:对象的不可见性

A:

what 类中的函数或方法进行私有化
why 对方法和函数进行安全性保护
when 当不想从外部调用对象时使用
how

表示私有的方法是:在变量或方法前加__函数名;__变量名
在实例化时,可以通过公开的方法,内置的命令,访问到私有变量,但不可以从外部直接访问
在实例化时,不可以访问私有方法。

how much

没有关键字public private
在类实例字典中私有变量会显示成_类名__变量名
构造函数的__init__,凡是前后都有双下划线的,系统不认为私有
不可以从外部动态的建立私有变量
其实从外部可以访问私有变量,用_类名__变量名,但不推荐

Q:继承性

A:

what

在这里插入图片描述

why 继承性的作用是避免定义重复的方法和变量
how

类1继承了类2的特征,类1是类2是子类,类2是类1的父类
模块1:

from 模块2 import2
#class前需要两排空行
class1(2):
    def __init__(self,  子变量1, 父变量1, 父变量2): #def前有空行
        self.子变量1 = 子变量1
        父类名.__init__(self, 父变量1, 父变量2)  #将数据传入父类中,需要加self
        super(子类名, self).__init__(父变量1, 父变量2) #另一种方法,应优先考虑

    def 函数1(self): #方法  def前有空行
        super(子类名, self).函数2() #若子类父类方法重名,则加入super优先调用父类方法
        print('语句')

模块2:

class2():
#def前有空行
    def __init__(self, 父变量1, 父变量2):
        self.父变量1 = 父变量1
        self.父变量2 = 父变量2
#方法
#def前有空行
    def 函数2(self):
        print('语句')

实例化:

实例1.1 =1(子变量1, 父变量1, 父变量2)
实例1.函数1()
实例1.函数2()
how much

子类可以完全继承父类的方法,变量,以及构造函数需要的赋值
允许多继承,一个子类可以继承多个父类
子类方法和父类方法同名的话,优先调用子类方法

举例6:类的继承

模块1:

from c2 import Human

class Student(Human):
    def __init__(self, school, name, age):
        self.school = school
        Human.__init__(self, name, age)
#另一种方法
        super(Student, self).__init__(name, age)
    def Homework(self):
        print(self.school)

stu1 = Student('港大', '小a', 18)
stu1.PrintName()

模块C2:

class Human():
    HumanSum = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def PrintName(self):
        print(self.name)

输出:
小a

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值