Python 中的 修饰符(@classmethod,@property)

1、@classmethod 类方法

Python类中,@classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls ,以用来调用类的属性,类的方法,实例化对象等。
但是在类的其他函数中被调用时依然需要用self,如下类:

class ToMysql:
    def __init__(self, sql_host, sql_user, sql_passwd,sql_db_name):
        self.sql_connect=pymysql.connect(host=sql_host,
                                        user=sql_user,
                                        password=sql_passwd,
                                        db=sql_db_name,
                                        charset='utf8mb4',
                                        cursorclass=pymysql.cursors.DictCursor)
   
    @classmethod
    def build_table_sqlStr(cls, table_name, fields_info, keys, prim_key=None):
    	cls.fields_info=fields_info
    def sql_createTable(self, table_name, fields_def, prim_keys, keys):
        self.sql_connect.ping(reconnect=True)
        with self.sql_connect.cursor() as cursor:
            table_desc = self.build_table_sqlStr(
                table_name, fields_def, keys, prim_keys) #@classmethod修饰符函数在类中被其他函数调用时依然需要使用self
            cursor.execute(table_desc)

在类外调用时可以不需要先对类进行实例化,直接使用类名调用,如:
【注意】
① 这样,不会执行构造函数,且在类方法中不能使用self,而是cls;
②可以在类方法中使用 cls(sql_host, sql_user, sql_passwd,sql_db_name) 对类进行初始化。。。

ToMysql.build_table_sqlStr(table_name, fields_info, keys) # 直接用类名调用类方法,而不需要对类初始化,不执行构造方法
ToMysql.fields_info # 直接用类名获取类方法里面的‘变量’

2、@property

@property 将方法转换为相同名称的只读 属性,不知道里面的属性名,从而防止里面的属性被修改。
调用时与属性的调用方式一样。
如下:

class my_class:
	def __init__(self):
		self._embedding_type='base'
	@property
	def is_bert(self):
		return self._embedding_type=='bert'
	def embedding_type(self):
		return self._embedding_type

p=my_class()
print(p.embedding_type) # 用户进行属性调用的时候,直接调用embedding_type即可,而不用知道属性名_embedding_type,因此用户无法更改属性,从而保护了类的属性。
print(p.is_bert)

2、@staticmethod 静态方法

特点:
1、静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法;
2、静态方法的调用,既可以使用类名,也可以使用类对象
如:

class CLanguage:
    @staticmethod
    def info(name,add):
        print(name,add)
# 调用
C = CLanguage()
c.info('cc', 'add')
# 或
CLanguage.info('cc', 'add')

4、@函数名:整体作为一个修饰符

  • 一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西(如果返回不是一个可调用的对象那么会报错)。
  • 有两个修饰符时,被修饰函数的返回值作为参数传入上一层即FB(),FB()返回的值传入FA(),最终得到FA()返回的值。”,即先执行离被修饰函数近的装饰器,再执行离得远的装饰器
#Example 
def FA(fn):
    def warp():
        return "<a>"+fn()+"<a>"
    return warp
def FB(fn):
    def warp():
        return "<b>"+fn()+"<b>"
    return warp
    
@FA         #相当于makebold(test1),也就是把当前函数作为入参传过去
def test1():
    return "test1"
 
@FB
def test2():
    return "test2"
    
@FA
@FB
def test3():     #函数和装饰器是倒着执行的,从下往上,从内而外,一层层执行
    return "test3"
    
print(test1())
print(test2())
print(test3())

结果:

<a>test1<a>
<b>test2<b>
<a><b>test3<b><a>

类中的其他

(1)类变量,也称类属性

  • 类变量是在类定义内部但在任何方法之外声明的变量。它们属于类本身,而不是类的任何实例。这意味着,当我们创建一个类的实例时,类变量是不会被初始化的。
  • 类的所有实例都将共享同一个类变量。

python 中的“下划线”使用:
(1)类函数使用“前导单下划线”表示:告知其他程序员以单个下划线开头的变量或方法仅供内部使用(单不是强制);
(发牢骚:面向对象的程序语言,关于类里面的各种封装学的乱七八糟……)
类似的有成员函数、类函数(classmethod)、静态函数(staticmethod) (⊙o⊙)…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值