什么是对象?
成为python中的一般对象有三个基本的要求:
1,内存地址:可以使用id()方法获得对象的地址。
2,类型:对象是int,str等基本类型,还是其他类型,无论如何,可用type()方法获得对象的类型。
3,值:对象的内容,数字,字符或者其他可以成为其内容的东西
可做为对象的基本类型
简单举例:
a = 10#10就是a的值
id(a)#获取a的地址
type(a)#获取a的类型
函数也是python的对象
def fun(name):
print(name)
b = fun('a')
print(id(b))
print(type(b))
类也是python对象
class A():
def __init__(self):
print("this is a class")
pass
c = A
print(id(c))
print(type(c))
c()
补充关于 ()
函数的函数名和函数名加()区别
def add(x, y):
return x + y
print(add) # 不加(),获得的是函数对象本身
result = add(1, 2)# 加(),表示调用
print(result)
类class也是同理
函数作为另一个函数的参数
既然python函数也是对象,那么函数本身就也能作为参数传递到另一函数,这个在后续的闭包和装饰器还会涉及
def add(x, y):
return x + y
def func2(f):
return f#这个函数会将获得的函数名(函数对象)作为返回值返回
c = func2(add)#这里c接受add作为参数的func2函数返回的add函数,
print(c(1,2))#c也就是add函数,能实现一样的功能
print(id(add),id(c))
可以看见c和add的地址是一样的,说明两者本就是一样的对象。
魔术方法
形如 __xxx__的方法在python中叫做魔术方法(magic method),在不加限制的情况下所有的类都可以实现各种魔术方法,**魔术方法不是从object中继承的,python中每个类都可以有魔术方法,**这是由python的特性决定的。
多态
类似于其他语言的类设计,python也有自己的多态和继承关系。不再赘述相关的知识内容,举例说明python的多态。
from abc import abstractmethod
class Animal:
@abstractmethod
def react(self):#这是抽象基类的抽象方法,必须在子类中实现
pass
class Dog(Animal):
def react(self):
print("barking")
pass
class Cat(Animal):
def react(self):
print("miao!")
pass
dog = Dog()
dog.react()
cat = Cat()
cat.react()
鸭子类型
一个东西长得像鸭子,叫声像鸭子,走路像鸭子,吃起来味道也像鸭子,那么它就是鸭子
如果熟悉C++,继承和多态就不会陌生,在C++中多态的表现形式为:同一个父类指针,其中的指针指向不同的子类,使用“->”运算符调用共有的一个方法,指向不同的子类的指针执行的操作不同,这就是大多数人第一次接触虚函数和动态绑定。
#include <iostream>
// 基类 Animal
class Animal {
public:
// 基类的虚函数
virtual void makeSound() {
std::cout << "Animal makes a sound." << std::endl;
}
};
// 派生类 Dog
class Dog : public Animal {
public:
// 重写虚函数
void makeSound() override {
std::cout << "Dog barks." << std::endl;
}
};
// 派生类 Cat
class Cat : public Animal {
public:
// 重写虚函数
void makeSound() override {
std::cout << "Cat meows." << std::endl;
}
};
int main() {
Animal* animal;
Dog dog;
Cat cat;
// 使用基类指针指向派生类对象
animal = &dog;
animal->makeSound(); // 调用的是派生类 Dog 的成员函数
animal = &cat;
animal->makeSound(); // 调用的是派生类 Cat 的成员函数
return 0;
}
换到python中要更为方便,直接调用同名的方法,由编译器选出应该执行的方法,多支的继承还会涉及继承树,这个以后再说。(懒)
from abc import abstractmethod
class Animal:
@abstractmethod
def react(self):
pass
class Dog(Animal):
def react(self):
print("barking")
pass
class Cat(Animal):
def react(self):
print("miao!")
pass
tp = (a,b,c) = Dog(),Cat(),Dog()
for item in tp:
item.react()
猴子补丁
在 Python 中,我们可以使用猴子补丁(monkey patch)来修改已经定义好的类或模块,用以改变或添加新的功能。
class MyClass:
def __init__(self, value):
self.value = value
def new_method(self):#新方法
print("This is a new method")
# 使用猴子补丁为 MyClass 增加新方法
MyClass.new_method = new_method
# 创建 MyClass 实例并调用新方法
obj = MyClass(10)
obj.new_method()