持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的19天,点击查看活动详情
👨🎓作者:Java学术趴
💌公众号:Java学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。
☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!
👋大家好!我是你们的老朋友Java学术趴。今天给大家分享一下类方法和静态方法以及私有化。私有化不仅可以私有化方法还可以私有化变量,被私有化的方法以及属性不可以被子类进行继承,极大的提高了系统的安全性,防止他人在继承父类的时候恶意修改父类中的属性值以及父类方法。
第十六章 类方法和静态方法
16.1 类方法的概念
- 类对象所拥有的方法,需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数,类方法可以通过类对象、实例对象调用。
# 类方法和静态方法
class Animal(object):
# 类属性
name = '小白'
# 类方法上面加 @classmethod 注解
# 类方法必须存在第一个参数,这个参数就是类对象
@classmethod
def get_name(cls):
print(cls.name)
pass
pass
@classmethod
def change_name(cls, name):
cls.name = name
pass
animal = Animal()
# 通过类的实例对象调用类方法
animal.get_name()
# 小白
# 通过类直接调用类方法
Animal.get_name()
# 小白
# 调用类方法改变类属性
animal.change_name('大黑')
animal.get_name()
# 大黑
16.2 静态方法的概念
- 类对象所拥有的方法,需要用@staticmethod来表示静态方法,静态方法不需要任何参数。
注意:并不是一定不要给参数,也可以给,但是一般写静态方法的时候都不给参数
- 静态方法一般不使用类对象进行调用,而是使用类直接调用
# 类方法和静态方法
class Animal(object):
# 类属性
name = '小白'
# 类方法上面加 @classmethod 注解
# 类方法必须存在第一个参数,这个参数就是类对象
@classmethod
def get_name(cls):
print(cls.name)
pass
@staticmethod
def show_name():
# 有了return之后就不需要使用pass跳出方法体了
return Animal.name
pass
# 静态方法通过类直接访问,而不是使用类的实例对象
print(Animal.show_name())
# 小白
为什么要使用静态方法呢?
- 由于静态方法主要存放逻辑性的代码,本身和类以及实例对象没有交互,也就是说,在静态方法中,不会涉及到类中方法和属性的操作。数据资源得到了充分的利用。
第十七章 私有化
17.1 私有化属性
私有化属性的概念
在上几个章节,我们声明类属性还有实例属性都可以通过类对象以及类实例对象直接修改,但是有些数据的安全级别比较高,不让外部人员进行修改,此时就需要把这些属性进行私有化声明,添加一个可调用的方法去访问这些类属性
属性私有化的场景
- 把特定的一个属性隐藏起来,不想让类的外部进行直接调用。
- 把这个属性保护起来,不想让这个属性的值随意的改变
- 不让子类继承这个属性
语法格式:
- 两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
class Animal(object):
# 私有化类属性(只需要在普通的属性前面加上”__“就变成了私有化属性)
__name = '动物'
# 非私有化属性
age = '20'
pass
类的外部不可以直接访问私有化属性
# 私有化属性
class Animal(object):
# 私有化类属性
__name = '动物'
# 非私有化属性
age = '20'
# 创建类实例对象调用的方法
def __init__(self):
# 私有化实例属性
self.__type = '柯基'
# 非私有化实例属性
# 这里必须使用 self.color定义类实例对象才可以访问到,直接 color = '黄色',子类不可以直接访问到
self.color = '黄色'
pass
pass
# 定义类的实例对象
dog = Animal()
# 实例对象使用非私有化类属性
print(dog.age)
# 20
# 实例化对象使用私有化类属性
# print(dog.__name)
# 报错。在类的外面不可以直接访问类属性
# 实例对象访问非私有化实例属性
print(dog.color)
# 黄色
# 实例对戏访问私有化实例属性
# print(dog.__type)
# 报错。实例对象不可以直接访问实例属性
# 即使通过类名去访问私有化属性也会报错
print(Animal.__name) # 报错
类中可以访问和修改私有化的类属性和实例属性
通过类提供的公共方法去访问类的私有化属性,只能访问,不可以进行修改
# 私有化属性
class Animal(object):
# 私有化类属性
__name = '动物'
# 非私有化属性
age = '20'
# 创建类实例对象调用的方法
def __init__(self):
# 私有化实例属性
self.__type = '柯基'
# 非私有化实例属性
# 这里必须使用 self.color定义类实例对象才可以访问到,直接 color = '黄色',子类不可以直接访问到
self.color = '黄色'
pass
# 类中可以修改和访问私有化类属性
def get_data(self):
# 修改私有化类属性
self.__name = '大黑'
print(self.__name)
pass
pass
dog = Animal()
# 通过类提供的公共方法去访问私有化类属性
dog.get_data()
# 大黑
子类不可以继承父类的私有化属性
# 私有化属性
class Animal(object):
# 私有化类属性
__name = '动物'
# 非私有化属性
age = '20'
# 创建类实例对象调用的方法
def __init__(self):
# 私有化实例属性
self.__type = '柯基'
# 非私有化实例属性
# 这里必须使用 self.color定义类实例对象才可以访问到,直接 color = '黄色',子类不可以直接访问到
self.color = '黄色'
pass
pass
# 子类继承父类
class Dog(Animal):
# 访问父类中的私有化类属性
def get_data(self):
print(self.__name)
pass
pass
# 测试子类是否可以继承父类的私有化属性
dog = Dog()
print(dog.get_data())
# 报错,没有找到name属性,说明子类不可以继承父类的私有化属性
17.2 私有化方法
私有化方法概念
私有化方法根私有化属性的概念是一样的,有些重要的方法,不允许外部调用,防止子类意外重写,此时就把该方法设置为私有化方法。
语法
私有化方法,即在方法名前面加两个下划线
# 私有化方法
def __get_data(self):
print(self.__name)
pass
私有化方法不可以被外部进行调用
# 私有化方法
class Animal(object):
# 私有化属性
__name = '小白'
# 私有化方法
def __get_data(self):
print(self.__name)
pass
# 非私有化方法
def show_data(self):
# 类内部可以修改和调用私有化方法,和私有化属性一样
self.__get_data()
pass
pass
# 通过类直接调用私有化方法
# Animal.__get_data(Animal()) 报错
# 通过类直接调用哦个非私有化方法
Animal.show_data(Animal())
# 小白
dog = Animal()
# 通过类的实例对象调用私有化方法
# dog.__get_data() 报错
dog.show_data()
# 小白
子类不可以继承父类的私有化方法,不可以使用父类的私有化方法,只可以使用非私有化方法
# 私有化方法
class Animal(object):
# 私有化属性
__name = '小白'
# 私有化方法
def __get_data(self):
# 类内部可以修改和调用私有化方法,和私有化属性一样
self.__get_data()
pass
# 非私有化方法
def show_data(self):
print(self.__name)
pass
pass
class Dog(Animal):
pass
dog = Dog()
# 子类使用父类中的私有化方法
# dog.__get_data() 报错
# 子类使用父类的非私有化方法
dog.show_data()
# 小白
类中提供一个公共的方法供外部进行修改
# 私有化方法
class Animal(object):
# 私有化属性
__name = '小白'
# 私有化方法
def __get_data(self):
print(self.__name)
pass
# 非私有化方法,该公共方法提供给外部访问类中的私有属性
def show_data(self):
self.__get_data()
pass
# 非私有化方法,该用法提供给外部修改类中的私有化属性
def revise_data(self, name):
self.__name = name
pass
pass
class Dog(Animal):
pass
dog = Dog()
# 子类使用父类中的私有化方法
# dog.__get_data() 报错
# 子类使用父类的非私有化方法访问类中的私有化属性
dog.show_data()
# 小白
# 子类使用父类提供的非私有化方法修改类的私有化属性
dog.revise_data('大黑')
dog.show_data()
# 大黑
17.3 Property属性
其实这个Property属性相当于Java中的Getter和Setter方法,专门就是用于对私有化属性就行操作的
上面我们为了访问私有化属性,需要两个公共方法提供给外部使用。其中一个是用来访问私有化属性的方法,一个是用来修改私有化属性的方法。那么,这样对于调用者来说 感觉就是在调用一个方法,并不是访问属性。如果我们想直接来访问Python类中的私有化属性,此时就需要使用Property属性
使用Property属性的本质还是通过方法进行访问,只不过是在调用者看来,可以直接通过属性来访问。其实本质还是调用的方法
注意:既然使用Property属性,那么获取私有化属性的时候必须存在 return 语句
# Property属性
class Animal(object):
# 私有化属性
__name = '小白'
# 获取私有化属性的方法(这个方法既然要当作Property属性,那么必须存在 return 语句)
def get_name(self):
return self.__name
pass
# 修改私有化属性的方法
def set_name(self, name):
self.__name = name
pass
# 定义一个Property属性实现直接通过访问属性的形式访问私有化的属性
name = property(get_name, set_name)
pass
dog = Animal()
# 使用Property属性直接调用类的私有化属性
print(dog.name)
# 小白
# 使用Property属性去修改类的私有化属性
dog.name = '大黑'
print(dog.name)
# 大黑
以上这种形式使用的是原始的Property属性,还可以使用装饰器的方式。如下
# Property属性(装饰器)
class Animal(object):
# 定义私有化属性
def __init__(self):
self.__name = '小白'
pass
# 使用Proper的装饰器模式。提供一个获取私有化属性的方法
# 这个name并一定要和私有化属性名一致,是自定义的,一般定义为私有化属性名
@property
def name(self):
return self.__name
pass
# 使用Pro的装饰器模式,提供一个修改私有化属性的方式
# 这个name.setter 中的name必须和 @property 声明的函数名一致,否则找不到
@name.setter
def name(self, name):
self.__name = name
pass
pass
dog = Animal()
# 使用Property属性直接调用类的私有化属性
print(dog.name)
# 小白
# 使用Property属性去修改类的私有化属性
dog.name = '大黑'
print(dog.name)
# 大黑
\