python面向对象——类(中)

python面向对象——类(中)


1. 初始化方法(魔术方法__ xxx__() )

  • 在类中形如__xxx__()这种形式的方法,被称之为模塑方法(特殊方法 或 初始化方法),这种初始化方法不需要我们调用,它会在特定的时候自动调用。
class MyClass():    #定义一个类
    # name = '刘亦菲'

    def speak(self):   #定义方法
        print('大家好,我是%s'%self.name)

p1 = MyClass()   #类的实例化
p1.name = '刘亦菲'
p1.speak()     #在没有定义类的公共属性的情况下会报错,
# 两种的定义公共属性的方法:
# 1.通过 对象.属性    如:p1.name = '刘亦菲'
# 2.在类里面定义      如:类里面的 name = '刘亦菲'


#'使用初始化方法解决的问题:'
#问题: 1.手动添加容易忘记,查看代码需要那些参数比较麻烦
#      2.没有提示,可以创建成功实例,会导致后面的代码运行出错


class Preson():       #定义一个类

    #初始化方法
    def __init__(self,name,age):       #实例化创建的时候,init方法就会报错
        self.name = name
        self.age = age

    def speak(self):
        print('大家好,我是{},永远{}'.format(self.name,self.age))

name = input('请输入姓名:')
age = input('请输入年龄:')
p1 = Preson(name,age)       #类的实例化
p1.speak()

2. 类的封装

  • 出现封装的原因:是为了数据的安全,形成了一个默认的规则。告诉你的协同开发者这个属性很重要,不要随意修改
class Car():                              #定义一个类
    #初始化方法
    def __init__(self,name,color):  
        self.hidden_name = name
        self.color = color

    def run(self):
        print('汽车开始跑起来了')

    def dida(self):
        print('汽车鸣笛')


car = Car('兰博基尼','红色')    #类的实例化
car.name = '中华田园犬'   
car.run()    #调用方法
car.dida()

封装是面向对象的三大特性之一

  • 封装是指将对象内部的一些属性和方法进行隐藏,不被别人轻易的访问或修改。
# 封装:私有属性
class Car():
    def __init__(self,name,color):
        self._name = name     #私有属性,一般使用这个私有属性,属于商议协定
        self.color = color

    def run(self):
        print('汽车开始跑起来了')

    def dida(self):
        print('汽车鸣笛')


car = Car('法拉利','红色')
car._name = '中华田园犬'
car.run()
car.dida()
  • 类也提供了getter()和setter()方法实现外部可以访问到封装类的属性。
    • getter() 获取对象中指定的属性
    • setter() 用来设置对象指定的属性
class Car():
    def __init__(self,name,color):
        self._name = name     #私有属性,一般使用这个私有属性,属于商议协定
        self.color = color

    #getter方法:提供访问这个属性的方法
    def get_name(self):
        return self._name

    #setter方法:提供修改属性的方法
    def set_name(self,name):
        self._name = name

    def run(self):
        print('汽车开始跑起来了')

    def dida(self):
        print('汽车鸣笛')


car = Car('兰博基尼','红色')
# car._name = '中华田园犬'
car.run()
car.dida()
# print(car._Car__name)
print(car.get_name())
car.set_name('玛莎拉蒂')
print(car.get_name())

'''
- 使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全
• 1. 隐藏属性名,使调用者无法随意的修改对象中的属性
• 2. 增加了getter()和setter()方法,很好控制属性是否是只读的
• 3. 使用setter()设置属性,可以在做一个数据的验证
• 4. 使用getter()方法获取属性,使用setter()方法设置属性可以在读取属性和修改属性的同时做一些其他的处理
'''
  • 对象的属性使用 self.___xxx这种双下划线开头的属性,表示对象的隐形属性,隐形属性只提供类的内部访问,无法通过外部访问。(其实隐藏属性知识python为属性改了一个名字——》_类名__属性名 如:__name ——》_Class__name)
#封装:隐藏属性
class Car():
    def __init__(self,name,color):
        self.__name = name   #隐藏属性,不可读的属性
        self.color = color

    def run(self):
        print('汽车开始跑起来了')

    def dida(self):
        print('汽车鸣笛')


car = Car('兰博基尼','红色')
car.__name = '中华田园犬'
car.run()
car.dida()
print(car._Car__name)
  • 实际上隐藏属性这种方法还是会被外部访问,所以很少使用,开发中,一般使用以_name这种单下划线开头的私有属性,没有特殊情况一般不会修改私有属性。

3. 装饰器(property )

  • 使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改
# 封装:私有属性


class Car():
    def __init__(self,name,color):
        self._name = name     #私有属性,一般使用这个私有属性,属于商议协定
        self.color = color

    #getter方法:提供访问这个属性的方法
    @property
    # def get_name(self):
    #     return self._name
    def name(self):
        return self._name

    #setter方法:提供修改属性的方法
    @name.setter
    # def set_name(self,name):
    #     self._name = name
    def name(self,name):
        self._name = name

    def run(self):
        print('汽车开始跑起来了')

    def dida(self):
        print('汽车鸣笛')


car = Car('兰博基尼','红色')
# car._name = '中华田园犬'     #访问属性
car.run()        #调用方法
car.dida()
# print(car._Car__name)
print(car.name)
car.name = '玛莎拉蒂'
print(car._name)

总结

本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。

仅是个人意见,如有不足之处或者侵权,请留言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python独角兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值