python面向对象--特殊方法、封装(中)

特殊方法

如果在类中需要针对多个对象定义相同属性或者方法的时候,为了避免遗漏定义,那么就需要使用特殊方法,在定义类对象的时候就必须定义特殊方法定义的属性或者方法:
DEMO:

class MyClass:
    # name = '葫芦娃'
    def speak(self):
        print('加油!!%s'%self.name)
p1 = MyClass()
p2 = MyClass()
p1.name = '钢铁侠'
p2.name = '绿巨人'
p1.speak()
p2.speak()

如果没有定义p1.name = ‘钢铁侠’ 属性:AttributeError: ‘MyClass’ object has no attribute ‘name’
例如在上述代码中有多个p3,p4,p5…那么每一个对象中都需要定义个*.name = ’ ',为了避免遗漏采用强制性定义,
特殊方法的格式:__开头__结尾的方法
例如:

def __init__(self):#该方法不要我们自己去调用

特殊方法不需要手动调用、
__init__在对象创建后立即执行
__init__在创建类对象的时候必须传参格式:def init(self,参数)

class MyClass:
    name = '1234'
    def __init__(self,name):#强制在创建对象的时候,必须传一个name的参数,
   #否则报错TypeError: __init__() missing 1 required positional argument: 'name'
        self.name = name
    def speak(self):
        print('加油!!%s'%self.name)
p1 = MyClass('葫芦娃')
p2 = MyClass('钢铁侠')
p1.speak()
p2.speak()

总结:
类的基本结构:
clss 类名([父类]):
#对象的初始化方法
def__init__(self,…)
pass
#其他方法
def method1(self,…)
pass
def method2(self,…)
pass

封装

1、增加数据的安全性–>之前讲的,可以通过对象.属性的方式进行重新赋值
2、不能随意更改–可以修改成某一类的值
3、不希望被外界访问到的属性或者方法
封装的步骤:
1、隐藏属性名
2、增加getter和setter方法,很好控制属性是否只读
3、使用setter方式时,可以对数据进行有效性检查利用if来限制

class dog:

    def __init__(self,name,age):
        self.hidden_name = name#隐藏名称
        self.hidden_age = age
    def get_name(self):
        return self.hidden_name
    def set_name(self,name):
        self.hidden_name = name
    def get_age(self):
        return self.hidden_age
    def set_age(self,age):
        self.hidden_age = age
d = dog('1',5)
print(d.hidden_name)
print(d.get_age())
d.set_name('2')
d.set_age(10)
print(d.hidden_name)
print(d.get_age())
'''
1
5
2
10
'''

把属性或者方法在函数内部定义时,通过定义的名称来达到隐藏的效果

其他封装

在定义对象名称时前面加上‘_ _'双下划线,单下划线也是可以的

class person():
    def __init__(self,name):
        self.__name = name
    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name = name
p = person('葫芦娃')
p.set_name('12')#通过这样是可以修改属性值的
print(p.get_name())

@property装饰器

对比:

class person():
    def __init__(self,name):
        self.__name = name
    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name = name
p = person('葫芦娃')
p.set_name('12')#通过这样是可以修改属性值的
print(p.get_name())#p.get_name()
class person():
    def __init__(self,name):
        self.__name = name
    @property#装饰器
    def get_name(self):
        return self.__name
    def set_name(self,name):
        self.__name = name
p = person('葫芦娃')
p.set_name('12')#通过这样是可以修改属性值的
print(p.get_name)#p.get_name
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值