Python中的“类型”和“对象”有什么区别?

Python super()详解
本文详细解释了Python中super()函数的使用方法,并通过具体示例展示了如何根据参数的不同调用方式来实现不同的功能。

这个问题已经有了一个答案:

  • Python中的元类是什么?14答案

我偶然发现这条巨蟒文献资料super关键词:

如果省略了第二个参数,则返回的超级对象将被解除绑定。如果第二个参数是对象,则isinstation(obj,type)必须为true。如果第二个参数是类型,则issubclass(type 2,type)必须是true(这对于classMethod很有用)。

有人能给我一个例子,说明将Type作为第二个参数传递与传递对象之间的区别吗?

文档是在谈论对象的实例吗?

谢谢。

Python的super函数根据参数的不同来做不同的事情。下面是使用它的不同方法的演示:

class Base(object):
    def __init__(self, val):
        self.val = val

    @classmethod
    def make_obj(cls, val):
        return cls(val+1)

class Derived(Base):
    def __init__(self, val):
        # In this super call, the second argument "self" is an object.
        # The result acts like an object of the Base class.
        super(Derived, self).__init__(val+2)

    @classmethod
    def make_obj(cls, val):
        # In this super call, the second argument "cls" is a type.
        # The result acts like the Base class itself.
        return super(Derived, cls).make_obj(val)

测试输出:

>>> b1 = Base(0)
>>> b1.val
0
>>> b2 = Base.make_obj(0)
>>> b2.val
1
>>> d1 = Derived(0)
>>> d1.val
2
>>> d2 = Derived.make_obj(0)
>>> d2.val
3

这个3结果是前一个修饰符的组合:1(从Base.make_obj)加2(来自Derived.__init__ ).

请注意,可以调用super只有一个论点来获得一个“未绑定”的超级对象,它显然没有多大用处。没有真正的理由这样做,除非你想搞乱Python内部和你真的知道你在做什么。

在Python 3中,您还可以调用super没有参数(这相当于提供当前类和self作为两个论点,但更神奇)。

Python中,一切皆对象,所以从广义上来说,所有的数据类型都是对象类型。不过,通常所说的“对象类型的数据”可能更侧重于自定义类的实例,与Python内置的基本数据类型(如整数、浮点数、字符串等)有一些区别: ### 定义方式 - **内置数据类型**:由Python语言本身定义,使用时直接创建实例。例如创建整数、字符串等: ```python num = 10 string = "Hello" ``` - **自定义对象类型**:需要先定义类,再通过类创建实例。例如: ```python class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("Alice", 25) ``` ### 数据结构行为 - **内置数据类型**:具有固定的数据结构预定义的行为。例如,整数可以进行加减乘除等运算,字符串可以进行拼接、切片等操作。 ```python a = 5 b = 3 print(a + b) # 加法运算 s = "abc" print(s[1:]) # 字符串切片 ``` - **自定义对象类型**:数据结构行为由类的定义决定,可以包含任意数量的属性方法。例如,上面定义的 `Person` 类的实例可以有 `name` `age` 属性,还可以定义其他方法: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def introduce(self): return f"My name is {self.name} and I'm {self.age} years old." p = Person("Alice", 25) print(p.introduce()) ``` ### 类型检查灵活性 - **内置数据类型**:类型相对固定,类型检查比较直接。例如使用 `type()` 函数检查类型: ```python num = 10 print(type(num) == int) # 检查是否为整数类型 ``` - **自定义对象类型**:可以通过继承多态实现更灵活的类型系统。一个对象可以属于多个类型(通过继承),并且可以根据不同的情况表现出不同的行为。 ```python class Animal: def speak(self): pass class Dog(Animal): def speak(self): return "Woof!" class Cat(Animal): def speak(self): return "Meow!" animals = [Dog(), Cat()] for animal in animals: print(animal.speak()) ``` ### 内存管理性能 - **内置数据类型**:通常经过优化,内存管理操作效率较高。Python解释器对内置数据类型有专门的处理机制。 - **自定义对象类型**:由于需要维护类的结构方法,可能会占用更多的内存,并且方法调用的开销相对较大。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值