+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-03(70)

2020-04(60)

2020-05(24)

2020-06(39)

2020-07(23)

Python基础课第十三节课记录---面向对象第二讲

发布于2019-10-29 16:42     阅读(1113)     评论(0)     点赞(18)     收藏(1)


0

1

2

3

4

1. 特殊方法(魔术方法)

特殊方法都是以双下划线开头双下划线结尾的方法
特殊方法不需要自己调用
学习特殊方法

  1. 特殊方法什么时候调用
  2. 特殊方法有什么作用

对于Person这个类name属性是必须,并且每一个实例对象的name属性是不一样的
我们现在是将name属性手动添加
特别容易出错

特殊方法不需要我们自己调用
特殊方法会在特殊的时候自动调用
init会在对象创建以后立即执行
init会像新创建的对象初始化属性

class Person:
    def __init__(self, age, name, gender):
        self.name = name
        self.age = age
        self.gender = gender
    def run(self):
        if self.age > 3:
            print(f'{self.name}已经是{self.age}岁的{self.gender}孩子了,会跑了。')
    def speak(self):
        if self.age < 4:
            print(f'{self.name}是{self.age}的{self.gender}孩子,还不会说话。')
person1 = Person(name='葫芦娃', age=5, gender='女')
person1.run()
# 葫芦娃已经是5岁的女孩子了,会跑了。
person2 = Person(2, gender='男', name='钢铁侠')
person2.speak()
# 钢铁侠是2的男孩子,还不会说话。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

类的基本结构

# class 类名([父类]):
    # 公共属性...
    # 对象的初始化方法
    # def __init__(self,....)
    # ....
    # 其他的方法
    # def method(self,...)
    # ....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. 类的练习

尝试定义一个表示车的类

class Car:
    def __init__(self, name, color):
        self.name = name
        self.color = color
    def run(self):
        print(f'{self.color }{self.name}正在跑')
    def didi(self):
        print(f'{self.color }{self.name}正在鸣笛')
c1 = Car('奔驰', '黑色')
c1.run()
# 黑色奔驰正在跑
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

我们要增加数据的安全性

  1. 属性不能随意修改(我让你改你才能改,不让你改你就别改)
  2. 属性不能改为任意的值

3. 封装

封装是面向对象的三大特性之一
封装指的是隐藏对象中一些不希望被外部访问到的属性或方法

如何隐藏对象中的一个属性
将对象的属性名,修改为一个外部不知道的名字
如何获取(修改)对象当中的属性
我们可以提供一个getter和setter方法可以访问和修改属性

使用封装,确实增长了类定义复杂度,但是它确保了数据的安全性

  1. 隐藏了属性名,使调用者无法随意修改对象当中的属性
  2. 增加了getter和setter方法,可以很好的控制属性是否是只读的
    ·如果希望属性是只读的,则可以直接去掉setter方法
    ·如果希望属性不能被外界访问,则可以直接渠道getter方法
  3. 使用setter方法设置属性,可以增加数据的验证,确保数据的值是正确的
  4. 可以在读取属性和设置属性做一些其他的操作
class Dog:
    def __init__(self, name, age):
        self.hidden_name = name
        self.hidden_age = age
    def run(self):
        print(f'{self.hidden_age}岁的{self.hidden_name}正在跑')
    def speak(self):
        print(f'{self.hidden_age}岁的{self.hidden_name}正在叫')
    def get_age(self):
        return self.hidden_age
    def set_age(self, age):
        if age > 0:
            self.hidden_age = age
    def get_name(self):
        return self.hidden_name
d1 = Dog('二哈', 5)
d1.run()
# 5岁的二哈正在跑
print(d1.get_name())
# 二哈
d1.set_age(4)
d1.run()
# 4岁的二哈正在跑
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

可以为对象的属性使用双下划线开头–>__xxx
双下划线开头的属性是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过外部访问
隐藏属性是python自动为属性改了一个名字
实际改的名字是:_类名__属性名[^__name --> _Person__name]

class Person:
    def __init__(self, name):
        self.__name = name
    def get_name(self):
        return self.__name
    def set_name(self, new_name):
        self.__name = new_name
p = Person('钢铁侠')
p.__name = '葫芦娃'
print(p.get_name())
# 钢铁侠
p._Person__name = '葫芦娃'
print(p.get_name())
# 葫芦娃
p.set_name = '蜡笔小新'
print(p.get_name())
# 葫芦娃
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

一般情况,使用_开头的属性都是私有属性,没有特殊情况下不要修改私有属性

4. @property

添加property装饰器以后,我们就可以像调用属性一个调用方法

class Person:
    def __init__(self, name):
        self._name = name
    @property
    def name(self):
        print('get方法执行了')
        return self._name
p = Person('蜡笔小新')
print(p.name)
# get方法执行了
# 蜡笔小新
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. 小结

这节课主要学的是面向对象的封装,这样可以隐藏数据,让数据更加安全。通过这堂课的学习,我也加深了一遍对类的印象,更加熟练的定义类并且使用类了。继续加油,还要更加认真地学习!

0

1

2

3

4

5



所属网站分类: 技术文章 > 博客

作者:9384vfnv

链接: https://www.pythonheidong.com/blog/article/147618/035a3046d90e64d93686/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)