Python类的疑难点

一、继承

1、Python类的继承与Java非常不同,它是通过直接在子类名称后面跟上小括号(),在括号里面写上父类的名称,例如:

父类:

class Cat():

子类:

class SubCat(Cat):

2、特殊的类:object

2.1、object类是所有类的父类,因此所有类都有object类的属性和方法。

class Dog:
    def __init__(self):
        self.name = "hello"

dog = Dog()

print(dir(dog))

输出的结果如下:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']

2.2、class Layer(object)

在老的代码里面会有上的写法,如果不直接写的话,是不会从object类继承的,也就是不会继承object相关的属性和方法,但是新版本的Python全部都继承自object,就像Java的Object类一样。所以大家看到有些代码里面会有如上的写法。

2.3、dir()函数

返回对象的属性和方法

二、类的对象可以像函数一样被调用

经常会在代码里面看到如下的写法:

dog = Dog()
dog()

首先创建一个对象,然后对象像函数一样被调用了。what?

1、__call__()是一种magic method,在类中实现这一方法可以使该类的实例(对象)像函数一样被调用。默认情况下该方法在类中是没有被实现的。

2、如果类没有实现该函数,调用__call__()会报错吗?

Traceback (most recent call last):
  File "Dog.py", line 8, in <module>
    dog()
TypeError: 'Dog' object is not callable

从代码运行的结果看,直接报错了!!!

3、重写__call__()

class Dog:
    def __init__(self):
        self.name = "hello"
    def __call__(self, *args, **kwargs):
        print("hello world!!!")
dog = Dog()

dog()

程序输出结果:

hello world!!!

其实这两种写法等价:

dog() == dog.__call__()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值