python对象和实例
A. python的类和对象入门
本文来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向“对象”编程这类段子,而面向对象编程的语言都会有三大特征:封装、继承、多态。
我们平时接触到的很多函数、方法的操作都具有这些性质,我们只是会用,但还没有去深入了解它的本质,下面就介绍一下关于类和对象的相关知识。
封装这个概念应该并不陌生,比如我们把一些数据封装成一个列表,这就属于数据封装,我们也可以将一些代码语句封装成一个函数方便调用,这就是代码的封装,我们也可以将数据和代码封装在一起。用术语表示的话,就是可以将属性和方法进行封装,从而得到对象。
首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房的基础上改造成的精装房。
在类定义完成时就创建了一个类对象,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化。
属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方法对象。
这里也支持对类属性进行赋值操作,比如为类中的weight属性赋予一个新值。
而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量,如下:
ming就是由类对象实例化后创建的一个实例对象,通过实例对象也可以调用类中的属性和方法。
类在实例化过程中并不都是像上面例子一样简单的,一般类都会倾向将实例对象创建为有初始状态的,所以在类中可能会定义一个__init__的魔法方法,这个方法就可以帮助接收、传入参数。
而一个类如果定义了__init__方法,那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法,请看下面这个例子。
可以看到在__init__()中传入了参数x和y,然后在print_coor中需要接收参数x和y,接下来通过实例化这个类对象,验证一下参数是否能通过__init__()传递到类的实例化操作中。
所谓继承就是一个新类在另一个类的基础上构建而成,这个新类被称作子类或者派生类,而另一个类被称作父类、基类或者超类,而子类会继承父类中已有的一些属性和方法。
比如上面这个例子,我并没有将list_定义成一个列表,但它却能调用append方法。原因是类Mylist继承于list这个基类,而list_又是Mylist的一个实例化对象,所以list_也会拥有父类list拥有的方法。当然可以通过自定义类的形式实现两个类之间的继承关系,我们定义Parent和Child两个类,Child中没有任何属性和方法,只是继承于父类Parent。
当子类中定义了与父类中同名的方法或者属性,则会自动覆盖父类对应的方法或属性,还是用上面这个例子实现一下,方便理解。
可以看到子类Child中多了一个和父类Parent同名的方法,再实例化子类并调用这个方法时,最后调用的是子类中的方法。Python中继承也允许多重继承,也就是说一个子类可以继承多个父类中的属性和方法,但是这类操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了。
多态比较简单,比如定义两个类,这两个类没有任何关系,只是两个类中有同名的方法,而当两个类的实例对象分别调用这个方法时,不同类的实例对象调用的方法也是不同的。
上面这两个类中都有introce方法,我们可以实例化一下两个类,利用实例对象调用这个方法实现一下多态。
判断一个类是否是另一个类的子类,如果是则返回True,反之则返回False。
需要注意的有两点:
判断一个对象是否为一个类的实例对象,如果是则返回True,反之则返回False。
需要注意的有两点:
判断一个实例对象中是否包含一个属性,如果是则返回True,反之则返回False。
需要注意的是第二个参数name必须为字符串形式传入,如果不是则会返回False。
B. python什么是类,对象,实例
类和对象
对象是什么?
对象=属性(静态)+方法(动态);
属性一般是一个个变量;方法是一个个函数;
#类的属性 就是 类变量
#实例变量:定义在方法中的变量,只作用于当前实例的类。
例子:
class Turtle:#python 中类名约定以大写字母开头
'''关于类的简单例子。。。'''
#属性 == 类变量
color ="green"
weight="10kg"
legs=4
shell=True
mouth='big'
#方法
def climb(self):
self.name = "test" #实例变量:定义在方法中的变量,只作用于当前实例的类。
print("我在很努力爬。")
def run(self):
print('我在很努力跑。')
def bite(self):
print('我要要要要要')
def sleep(self):
print('我要睡觉啦。')
#创建一个实例对象也就是类的实例化!
tt =Turtle() #类的实例化,也就是创建一个对象,类名约定大写字母开头
tt.bite() #创建好类后就能调用类里面的方法叻;
tt.sleep()
C. [Python]使用metaclass创建类对象
本文旨在深入探讨元类(metaclass)在Python中的应用,通过实例演示如何使用自定义元类来控制类对象的创建行为。元类是类的一种,主要用于创建类对象。Python自带的`type()`函数就是一个元类,能够动态创建类对象。然而,为了实现更灵活的控制和扩展类的行为,我们可以自定义元类,这通常通过继承`type`类实现。
元类与类之间的关系可以概括为:元类创建类对象,类创建实例对象。简而言之,实例对象是类对象的实例,类对象是元类对象的实例。
自定义元类的步骤
在Python中自定义元类需要遵循以下步骤:
定义一个类作为元类,该类需要继承自`type`。
在元类中实现特定逻辑,例如通过修改类属性、方法等。
在类定义中明确指定使用自定义元类,如使用`metaclass=my_metaclass`。
在实现自定义元类时,需要特别关注传递给元类的参数,即类名、基类列表以及类属性字典。元类接收这些参数,并据此创建新的类对象。
实例解析
我们以`A`类为例,假设`A`类继承自`B`和`C`类,并通过自定义元类`my_metaclass`控制`A`类的创建过程。在`my_metaclass`中,可以通过修改类属性字典来改变类属性值,甚至添加新的类属性。
当定义`A`类时,Python解释器会扫描定义语句并提取参数,然后将这些参数传递给元类`my_metaclass`。在元类内部,通过`attrs`字典修改类属性,并通过调用`type()`函数创建新的类对象。最终,这个新的类对象作为结果返回给类定义。
注意事项
使用自定义元类进行类创建时,需要考虑到道德问题。例如,改变类属性值或添加未定义的类属性可能在代码逻辑中产生混淆,导致难以追踪代码意图。因此,在使用自定义元类时,应确保其用途清晰且不会误导其他开发者。
总结
本文详细介绍了如何通过自定义元类来控制类对象的创建过程,包括元类的基本概念、使用场景和实现步骤。通过实例演示,我们了解了如何在类定义中指定自定义元类,并通过修改类属性字典来实现类行为的定制。在实际应用中,合理使用元类可以提高代码的灵活性和扩展性,但同时需要注意避免潜在的混淆和错误。
D. python class用法理解
python中class用法是什么呢?不知道的小伙伴来看看小编今天的分享吧!
1、class的定义及常用称呼:
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
对象:它是类的实例化。
方法:指类中定义的函数。
2、类对象支持两种操作:
属性引用和实例化。
属性引用的语法:obj.属性
类实例化的语法:obj = 类名()
类中方法的调用:obj.方法名()
3、举例:
例1
class student(object): #自定义一个类student
def speak(self): ## 哪个对象调用了这个方法,self就是那个对象;可以把self理解为一个形参
print(%s 说:我今年%s岁 % (self.name, self.age))
john = student() #类student 实例化一个对象john
john.name = 约翰 # 给对象添加属性
john.age = 19
john.speak() # 调用类中的 speak()方法
此时的输出为
约翰 说:我今年19岁
例2
class student(object): # 定义构造方法 有init,有别于自定义类
def __init__(self, n, a): #__init__() 是类的初始化方法;它在类的实例化操作后 会自动调用,不需要手动调用;
self.name = n
self.age = a # 设置属性
def speak(self): # 定义类中的普通方法
print(%s 说:我今年%s岁 % (self.name, self.age))
john = student(约翰,19) #类student 实例化一个对象john
john.speak() # 调用类中的 speak()方法
最后的输出同上个例子
在python中使用__开头 并以__结尾的方法,称之为魔法方法;
init(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法; init(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里;
常用到的魔法方法还有:str(self) 、 del(self)等。
4、类的继承以及super,self的使用:
子类继承父类,即子类拥有了父类的属性和方法。
python中类的初始化都是__init__()。所以父类和子类的初始化方式都是__init__()
但是如果子类初始化时没有这个函数,那么它便调用父类的__init__();(对应例input1)
如果子类种调用了父类的init,但自己又定义了自己的init,那么就会覆盖父类的初始化函数,只显示子类自己的初始化。(对应例input2)
input1:
class Animal(object):
def __init__(self):
self.name = 我是父类
class Panda(Animal):
def __init__(self):
super().__init__() #使用super的方式来显示调用父类的__init__()函数
super(Panda, self).__init__() # 第二种super初始化的方式
if __name__==__main__:
panda = Panda() #实例化Panda
print(panda.name)
output1:
我是父类
input2:
class Animal(object):
def __init__(self):
self.name = 我是父类
class Panda(Animal):
def __init__(self):
super().__init__()
self.name = panda
if __name__==__main__:
panda = Panda()
print(panda.name)
output2:
panda
2. self和super的区别:
(1) self是首先调用自身的方法如果自身没有再去父类中找;super是直接从父类中找方法
(2)self是类(可以理解为形参),super是预编译指令
反正要继承父类,直接上super就ok了
input3:
class Animal(object):
def __init__(self):
self.name = 我是父类
def A(self): #父类中的A方法
print(父类的A方法)
class Panda(Animal):
def __init__(self):
super().__init__()
self.myname = panda
def A(self): #子类中的A方法
print(子类的A方法)
def B(self):
self.A() #self调用A
super().A() #super调用A
if __name__==__main__:
panda = Panda()
panda.B() #通过B函数来调用A方法,查看self和super的区别
output3:
子类的A方法#我们说过self是先从自身找方法,没有再去父类找
父类的A方法#而super则是直接从父类中找