python进阶1——万物皆为对象

什么是对象?

成为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()

result

鸭子类型

一个东西长得像鸭子,叫声像鸭子,走路像鸭子,吃起来味道也像鸭子,那么它就是鸭子
如果熟悉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;
}

result
换到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()

result

猴子补丁

在 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() 

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值