这是我参与11月更文挑战的16天,活动详情查看:2021最后一次更文挑战。
私有属性与私有方法
在以上的学习中,我们了解到定义在__init__()构造方法初始化对象的属性是可以在类的外部访问到。那在实际开发中,对象的某些属性或者方法,可能只希望在对象的内部使用,这时,我们就可以使用:
私有属性;私有方法。
私有属性
私有属性:
- 就是对象不希望公开的属性。
定义方式:在属性名前面增加两个下划线(例如:__name)。
那如果有需求一定要在类的外部访问到对象的私有属性时,我们可以使用如下步骤:
- 可以通过类的内部的方法访问私有属性;
- 通过类的内部方法将私有属性返回出去;
- 在类的外部调用该方法并且接收就可。
class Person:
def __init__(self):
self.name = "肉丝"
self.__age = 20 # 私有属性定义
def test(self):
# print(self.__age) # 在类的内部 可以访问 私有属性
return self.__age
rose = Person()
rose_age = rose.test()
print(rose_age,'test') # 20 test
私有方法
私有方法:
- 就是对象不希望公开的方法。
定义方式:在方法名前面增加两个下划线(例如:__test)。
⚠️注意: 在python中,并没有真正意义上的私有,只有伪私有。当我们在访问时,以对象._类名__私有属性名称即可访问,私有方法同。
class Person:
def __init__(self):
self.name = "肉丝"
self.__age = 20 # 私有属性定义
rose = Person()
print(rose._Person__age) # 20
成员
类的成员可分为:
字段方法属性
字段又主要可以分为:
普通(实例)字段静态(类)字段
普通字段(实例属性)
普通字段属于对象,保存在对象中,只能通过对象访问:
- 定义:
self.字段名称; - 访问:
self.字段名称或对象.字段名称。 定义一个省份类,打印输出班级每位同学所在的国家与省份:
class Province(object):
def __init__(self,country,name):
self.country = country
self.name = name
def print_info(self):
print(self.country,self.name)
hunan = Province("中国","湖南")
shandong = Province("中国","山东")
hunan.print_info()
shandong.print_info()
但是这样实现,会有相应的问题。比如说,普通字段保存在对象中,也就是说,当创建一个对象时,就会重新创建self.country以及self.name字段。
当存对象的字段值相同时,仍然使用普通字段便会造成我们内存的浪费。
静态字段(类属性)
静态字段属于类,保存在类中。在创建时,仅创建一份,并且所有对象都共享静态字段。执行时可以是类访问也可以是对象访问:
- 定义:直接在类中定义;
- 访问:
类名.字段名称 或self.字段名称或对象.字段名称。
优化代码:
class Province(object):
country = "中国" # 静态字段 类属性
def __init__(self,name):
self.name = name # 普通字段
def print_info(self):
print(Province.country,self.name)# 静态字段 通过类名访问
hunan = Province("湖南")
shandong = Province("山东")
hunan.print_info()
shandong.print_info()
在实际开发中,如果字段的值是固定的,不随对象的改变而改变。那就使用静态字段(类属性),这样有利于节省内存的消耗。而如果字段的值随对象的改变而改变,就使用普通字段(实例属性)。