pythonclassdef_Python classmethod 修饰符

class A(object):

# 属性默认为类属性(可以给直接被类本身调用)

num = "类属性"

# 实例化方法(必须实例化类之后才能被调用)

def func1(self): # self : 表示实例化类后的地址id

print("func1")

print(self)

# 类方法(不需要实例化类就可以被类本身调用)

@classmethod

def func2(cls): # cls : 表示没用被实例化的类本身

print("func2")

print(cls)

print(cls.num)

cls().func1()

# 不传递传递默认self参数的方法(该方法也是可以直接被类调用的,但是这样做不标准)

def func3():

print("func3")

print(A.num) # 属性是可以直接用类本身调用的

# A.func1() 这样调用是会报错:因为func1()调用时需要默认传递实例化类后的地址id参数,如果不实例化类是无法调用的

A.func2()

A.func3()

tt

tt

xia***ei_x@163.com2年前 (2018-10-14)

`__class_getitem__`是Python 3.7中引入的一个特殊方法,用于动态创建泛型类型。它是一个类方法,用于获取一个类的泛型参数,并返回一个新的泛型类型。 `types.GenericAlias`是Python 3.7中引入的一个内置类型,用于创建泛型类型。它接受两个参数:`origin`和`args`。其中,`origin`表示泛型类型的原始类型,例如`List`、`Tuple`、`Dict`等;`args`表示泛型类型的参数,例如`List[int]`、`Tuple[str, int]`、`Dict[str, float]`等。 当我们使用`__class_getitem__`方法来创建泛型类型时,我们需要将其设置为`classmethod`,并将其定义为`types.GenericAlias`。这样,当我们创建一个泛型类型时,Python会自动调用`__class_getitem__`方法来解析泛型参数,并返回一个新的泛型类型。 下面是一个使用`__class_getitem__`和`types.GenericAlias`创建泛型类型的示例代码: ```python import types class MyList(list): @classmethod def __class_getitem__(cls, params): return types.GenericAlias(list, params) # 创建一个泛型类型 MyListInt = MyList[int] # 创建一个实例 my_list = MyListInt([1, 2, 3, 4, 5]) # 输出实例的类型和值 print(type(my_list)) print(my_list) ``` 在这个示例中,我们定义了一个`MyList`类,它继承自Python内置的`list`类,并重载了`__class_getitem__`方法。在`__class_getitem__`方法中,我们使用`types.GenericAlias`创建一个新的泛型类型,并将其返回。然后,我们使用`MyListInt = MyList[int]`创建一个`int`类型的泛型`MyList`类型,并使用`MyListInt([1, 2, 3, 4, 5])`创建一个实例。最后,我们输出实例的类型和值,可以看到它是一个`MyListInt`类型的实例,且其值为`[1, 2, 3, 4, 5]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值