2023年 3月 18日

python基础班12课

python基础班第12课

复习

class MyClass(): # 定义类 图纸
    color ='red' # 属性

    def yanse(self):# 方法 行为
        print('车子是红色的')


mc =MyClass() #对象 类的实例化
print(mc.color)
mc.yanse()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

'''
面向过程
1.打开门
2.装大象
3.关门
'''
'''
面向对象(.后面是方法def)
1.冰箱.开门
2.冰箱.存储
3.冰箱.关门
'''
class Person():
    name ='liuyifei'

    def speak(self):
        print('大家新年好')

p1 =Person()
print(p1.name)
p1.speak()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

class Person():
    name ='liuyifei'

    def speak(self):
        print('大家新年好')

p1 =Person()
p1.name ='zhouhuimin'
print(p1.name)
p1.speak()码片
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

class Person():
    name ='liuyifei'

    def speak(self):
        print('大家新年好')
p2 =Person()
print(p1.name)
p1.speak()
print(p2.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

结论

属性最好是携带在实例(对象)中比较好,也就是创建实例属性

行为(方法)最好创建在类中

1.特殊方法

在这里插入图片描述

# 特殊方法
class Person():
    def __init__(self):对于init方法,创建实例的时候就会被调用(自动)
        print(11111)

    # def speak(self): # 谁调用speak方法,w就是那个对象本身
    #     print('大家新年好,我是%s'% self.name)


p1 =Person()
p1.__init__() #(手动调用)
# p1.name ='liuyifei'
# p1.speak()

p2 =Person()
# p2.name ='zhouhuimin'
# p2.speak()
p3 =Person()
# p3.name ='guanzhilin'
# p3.speak()

即是当用到self.name必须定义每一个对象的name(属性)会很麻烦
name这个属性是必须的,但每一个对象的name(属性)各不相同,不能直接在类中定义,
手动添加name属性容易遗忘,即使没有遗忘,查看源码很麻烦
解决方法 __init__
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

class Person():
    # name =‘刘亦菲’ #跟下面结果一样但是概念不同
    def __init__(self,name):
        self.name =name # 下面要传参
        # self.name ='huluwa'# 属性被定义在方法里

    def speak(self): # 谁调用speak方法,w就是那个对象本身
        print('大家新年好,我是%s'% self.name)


p1 =Person('liuyifei')# 在这里传参
# p1.__init__()
# p1.name ='liuyifei'
p1.speak()

p2 =Person('zhouhuimin')
# p2.name ='zhouhuimin'
p2.speak()
如果创建实例的时候没有定义name会直接报错
p3 =Person()
# p3.name ='guanzhilin'
p3.speak()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述
在这里插入图片描述

2.参数self

方式一:传参方式

class Person():


    def speak(w,name):# 传参方式
        print('大家新年好,我是%s'% name)

p1 =Person()
p2 =Person()
p1.name ='zhouhuimin'
p2.name ='liuyifei'
print(p1.name)
p1.speak('zhouhuimin')
p2.speak('liuyifei')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
class Person():


    def speak(w):
        # print('大家新年好,我是%s'% p1.name)
        print(w)

p1 =Person()
print(p1)
p2 =Person()
print(p2)
p1.name ='zhouhuimin'
p2.name ='liuyifei'
p1.speak()
p2.speak()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

结论

谁调用方法,w(self)就是对象本身
方法二 self.

class Person():


    def speak(w): # 谁调用speak方法,w就是那个对象本身 方法二
        print('大家新年好,我是%s'% w.name)


p1 =Person()
# print(p1)
p2 =Person()
# print(p2)
p1.name ='zhouhuimin'
p2.name ='liuyifei'
p1.speak()
p2.speak()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

3.封装

在这里插入图片描述
在这里插入图片描述

# 封装
class Car():
    def __init__(self,name,color):
        self.name =name
        self.color =color

    def run(self):
        print('开始跑了')

    def dididi(self):
        print('嘀嘀嘀')

car =Car('玛莎','黑色')
print(car.name,car.color)
car.run()
car.dididi()

car.name ='中华田园犬'
print(car.name,car.color)
car.run()
car.dididi()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

class Dog():
    def __init__(self,name):
        self.name =name


dog =Dog('藏獒')
# dog.name ='泰迪'
print(dog.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

class Dog():
    def __init__(self,name):
        self.name =name

dog =Dog('藏獒')
dog.name ='泰迪'# 改变了属性 但是一般不用这个方法
print(dog.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

# 封装是一个暗号,告诉你的协同开发者数据很重要,不要轻易修改
class Dog():
    def __init__(self,name):
        self.hidden_name =name #一般用的是_name 就是单下划线+属性
        
dog =Dog('藏獒')
dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
print(dog.hidden_name)
print(dog.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

# 封装是一个暗号,告诉你的协同开发者数据很重要,不要轻易修改
class Dog():
    def __init__(self,name):
        self.hidden_name =name # 这就是暗号 但通常是_属性

    # 创建一个方法 getter()方法 给调用者一个查询数据的方法
    def get_name(self): get_name 是一个特殊方法 下面的set_name也是
        print('get方法被调用')
        return self.hidden_name # 要查看return就像函数一样要在调用的时候加print
    # 创建一个setter()方法,给调用者一个修改数据的方法
    def set_name(self,name):
        print('set方法被调用')
        self.hidden_name =name



dog =Dog('藏獒')
dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
# print(dog.hidden_name)
# print(dog.name)
# 调用get和set
dog.get_name()
print(dog.get_name()) # get加return的返回值
dog.set_name('泰迪')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在这里插入图片描述
暗号:__name(下划线加xx)

# 真正的暗号 
class Dog():
    def __init__(self,name):
        self._name =name
  • 1
  • 2
  • 3
  • 4
class Dog():
    def __init__(self,name):
        self.__name =name 双下划线 不可改了
    # 创建一个方法 getter()方法 给调用者一个查询数据的方法
    def get_name(self):
        print('get方法被调用')
        return self.__name # 双下划线
    # 创建一个setter()方法,给调用者一个修改数据的方法
    def set_name(self,name):
        print('set方法被调用')
        self.__name =name # 双下划线
# 单下划线是可以修改但是要商量 隐藏属性
# 双下划线是不可以修改的 私有属性

dog =Dog ('藏獒')
# dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
# # print(dog.get_name())
# # print(dog.set_name('泰迪'))
dog._Dog__name ='泰迪' # 双下划线的还是可以这样改的 这里要双下划线
print(dog.get_name())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述

class Dog():
    def __init__(self,name):
        self.__name =name
    # 创建一个方法 getter()方法 给调用者一个查询数据的方法
    def get_name(self):  # 是一个特殊方法 # 下面的set_name也是
        print('get方法被调用')
        return self.__name  # 要查看return就像函数一样要在调用的时候加print
    # 创建一个setter()方法,给调用者一个修改数据的方法
    def set_name(self, name):
        print('set方法被调用')
        self._name =name
        return self._name
dog =Dog ('藏獒')
# dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
# # print(dog.get_name())
print(dog.set_name('泰迪'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

没讲完的 part4.property装饰器

在这里插入图片描述