一、继承
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
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__()