python基础08

私有属性和私有方法

1.私有属性

class Dog():
    def __init__(self):
        self.name = '3月'
        self.__age = 12   # 私有属性


dog = Dog()
print(dog.name)
print(dog.__age)
  • 加上两个下划线将属性变成私有属性
  • print(dog.__age)调用私有属性不可以

运行结果:在这里插入图片描述
再看下面这个更好的理解私有属性

class Dog():
    def __init__(self):
        self.name = '3月'
        self.__age = 12   # 私有属性


dog = Dog()

dog.name = '哈士奇'
dog.__age = 13
print(dog.name)
print(dog.__age)
  • dog.name = ‘哈士奇’
    dog.__age = 13
    现在我们对属性重新赋值
  • dog.__age = 13 这个属性是公有属性,只不过正好名字相同。所以才能打印出来

运行结果:

在这里插入图片描述
想要访问私有属性,用公有方法

class Dog():
    def __init__(self):
        self.name = '3月'
        self.__age = 12   # 私有属性

    # 利用公有方法,给私有属性赋值
    def set_age(self,age):
        self.__age=age

    # 利用公有方法,返回私有属性的值
    def get_age(self):
        return self.__age


dog = Dog()

dog.set_age(14)
print(dog.get_age())
  • def set_age(self,age):
     if age > 0:
         self.__age=age
     将set_age函数写成这样我们就可以对私有属性的值进行校验
     我们调用dog.set_age(-1)的时候仍然返回14
    

2.私有方法

class Tmall():
    def buy(self):
        return '购买成功'

    def check_money(self,money):
        if money < 100:
            print('金额不够')
        else:
            return self.buy()


t = Tmall()
print(t.check_money(200))

运行结果:
在这里插入图片描述

  • 但是如果直接调用buy的话也会返回‘购买成功’
    t = Tmall()
    print(t.buy())
    所以要想解决这个问题就要将buy()改成私有方法
class Tmall():
    def __buy(self):
        return '购买成功'

    # 利用公有方法 调用私有方法
    def check_money(self,money):
        if money < 100:
            print('金额不够')
        else:
            return self.__buy()


t = Tmall()
# print(t.check_money(200))
print(t.__buy())
  • 改成私有方法以后再通过
    t = Tmall()
    print(t.__buy())
    来调用将要报错在这里插入图片描述
  • 私有方法可以避免对象直接调用

类属性

通过下面的例子来理解类属性

先创建一个狗类

class Dog():
    def __init__(self, name):
        self.name = name  # 实例属性


dog = Dog('哈士奇')
print(dog.name)

现在我们要统计创建了多少只狗

class Dog():
    count = 0    # 类属性

    def __init__(self, name):
        self.name = name  # 实例属性
        Dog.count += 1


dog = Dog('哈士奇')
print(dog.name)
dog = Dog('阿拉斯加')
print(dog.name)
dog = Dog('藏獒')
print(dog.name)
print(dog.count)
  • 类属性就是外部函数的局部变量
  • 我们要在__init__()方法中递加是因为每次创建__init__()一定首先运行
  • Dog.count += 1
    用Dog.count而不是self.count是因为count是类属性应该用类去点他

运行结果:
在这里插入图片描述
下面来区分一下类属性、私有类属性、实例属性、私有实例属性:

class Dog():
    count = 0  # 类属性
    __count = 0  # 私有类属性

    def __init__(self, name):
        self.name = name  # 实例属性
        Dog.count += 1   

        self.__age = 12  # 私有实例属性


dog = Dog('哈士奇')
print(dog.name)
dog = Dog('阿拉斯加')
print(dog.name)
dog = Dog('藏獒')
print(dog.name)
print(dog.count)

对私有属性的调用要用公有方法

class Dog():
    count = 0  # 类属性
    __count = 0  # 私有类属性

    def __init__(self, name):
        self.name = name  # 实例属性
        Dog.count += 1

        self.__age = 12  # 私有实例属性

        Dog.__count += 1

    def get_age(self):
        return self.__age

    def get_count(self):
        return Dog.count


dog = Dog('哈士奇')
print(dog.name)
dog = Dog('阿拉斯加')
print(dog.name)
dog = Dog('藏獒')
print(dog.name)
print(dog.count)
print(dog.get_age())
print(dog.get_count())
  • 无论是私有实例属性还是私有类属性,都是不想让外部直接访问,要通过公有方法才可以
  • 实例属性前缀是self
    类属性是类的属性前缀是类名

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值