私有属性和私有方法
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
类属性是类的属性前缀是类名
运行结果: