精华内容
下载资源
问答
  • 有没有办法绕过python中的类的构造函数__init__?例:class A(object):def __init__(self):print "FAILURE"def Print(self):print "YEHAA"现在我想创建一个实例A.它可能看起来像这样,但是这种...

    有没有办法绕过python中的类的构造函数__init__?

    例:

    class A(object):

    def __init__(self):

    print "FAILURE"

    def Print(self):

    print "YEHAA"

    现在我想创建一个实例A.它可能看起来像这样,但是这种语法是不正确的。

    a = A

    a.Print()

    Thx提前为您的帮助。

    编辑:

    一个更复杂的例子:

    假设我有一个对象C,它的目的是存储一个单一的参数,并做一些计算。然而,该参数不是这样传递的,而是嵌入在巨大的参数文件中。它可能看起来像这样:

    class C(object):

    def __init__(self, ParameterFile):

    self._Parameter = self._ExtractParamterFile(ParameterFile)

    def _ExtractParamterFile(self, ParameterFile):

    #does some complex magic to extract the right parameter

    return the_extracted_parameter

    现在我想转储和加载该对象的实例C.但是,当我加载这个对象,我只有单个变量self._Parameter,我不能调用构造函数,因为它期待参数文件。

    @staticmethod

    def Load(file):

    f = open(file, "rb")

    oldObject = pickle.load(f)

    f.close()

    #somehow create newObject without calling __init__

    newObject._Parameter = oldObject._Parameter

    return newObject

    换句话说,不可能创建一个实例而不传递参数文件。然而,在我的“真正的”情况下,它不是一个参数文件,但一些巨大的数据垃圾,我当然不想携带在内存中,甚至存储到光盘。

    并且由于我想从方法Load返回一个C的实例我做了某种方式不得不调用构造函数。

    旧版编辑:

    一个更复杂的例子,这解释了为什么我问这个问题:

    class B(object):

    def __init__(self, name, data):

    self._Name = name

    #do something with data, but do NOT save data in a variable

    @staticmethod

    def Load(self, file, newName):

    f = open(file, "rb")

    s = pickle.load(f)

    f.close()

    newS = B(???)

    newS._Name = newName

    return newS

    正如你所看到的,由于数据不存储在类变量中,我不能将它传递给__init__。当然,我可以简单地存储它,但如果数据是一个巨大的对象,我不想在内存中随身携带或甚至保存到光盘?

    展开全文
  • Python如何使用类对象调用实例方法

    千次阅读 2020-05-06 15:29:40
    在前面的学习,我总结了python中的三种方法类型的,分别是实例方法、类方法和实例方法,可以参考文章从例子来到例子去-Python中实例属性、类属性与实例方法、类方法、静态方法。 我们知道,实例对象可以调用...

    在前面的学习中,我总结了python中的三种方法类型的,分别是实例方法、类方法和实例方法,可以参考文章从例子中来到例子中去-Python中的实例属性、类属性与实例方法、类方法、静态方法

    我们知道,实例对象可以调用这三种方法,而类对象只能调用类方法和实例方法,既然如此为何我们还要研究类对象调用实例方法呢?我们先看一个例子:

    class Dog:
        def action(self):
            print("吃骨头")
    #通过类名直接调用实例方法
    Dog.action()
    """
    上述代码执行的结果:
    TypeError: action() missing 1 required positional argument: 'self'
    """
    

    显然,程序会报错,但是我们观察一下报错的信息提示,即:调用的方法中没有给self传参数,slef就是我们对象的引用。
    这个提示告诉了我们,之前在使用实例对象调用实例方法的时候,其实是python自动给self参数进行了传值,而使用Dog.action()的方式,我们只有类对象的引用,缺少实例对象的引用,python不能够实现自动的传递了。
    因此,我们可以根据提示传递一个实例对象的引用,进行手动操作,我们修改一下代码,来验证这样的思想是否正确:

    class Dog:
        def action(self):
            print("吃骨头")
            
    dog = Dog()
    Dog.action(dog)
    """
    上述代码执行的结果:
    吃骨头
    """
    

    从结果可以看到python是允许类名直接调用实例方法的。

    总结

    通常情况下,我们都是使用类的实例对象调用类中的实例方法的,如果想使用类名进行调用,需要手动给该实例方法传递实例对象的引用。

    展开全文
  • 绝对不是一句空话,在Python的解释器里,不仅有自己定义是对象,使我们传统意义上认为一切东西都是对象,对于执行的代码、函数、以及数据类型,你都可以在Python的源代码找到相应的类对象,因此他们也都是实例对象...

    在正式开始之前,我们先看一段代码:


        下面我们来分析这段代码,上图的左边是实际的代码过程,右边为执行后的结果。


        Python中一切皆对象。绝对不是一句空话,在Python的解释器里,不仅有自己定义是对象,使我们传统意义上认为一切东西都是对象,对于执行的代码、函数、以及数据类型,你都可以在Python的源代码中找到相应的类对象,因此他们也都是实例对象。在Python3中,一切对象皆有父类对象。所有对象都有继承父类对象,要么继承于 自定义的对象,要么继承自内置的父类对象即object 。因此只要是有自定义对象,总有一个自定义对象是继承自object对象的或者元类对象。

    所有的实例对象都是由类对象创建的。那么你可能会问:“”那是类对象是由什么创建的呐?“”创建Python语言的龟叔在Python解释器中,定义了一个上帝类即type元类,所有的类对象都是由元类对象创建,元类对象自身创建自身。即类本身也是一个对象即类对象。

    实例对象在创建时,由Python解释器自动赋予了一个特殊的属性即__class__(可以认为是魔法属性)。该属性的作用是:会找到相对应的实例对象的类对象内存地址。

    我们知道我们在定义类时,将所有的实例方法和类方法以及静态方法是定义在类对象中的。那么实例对象是如何访问到实例方法和类方法以及静态方法的呐?这就是__class__属性的作用了,在内存中也确实是这种情况。文字不好描述,直接上图。


    在创建实例对象后会自动执行初始化方法(__init(self,*args,**args)),将实例对象的属性进行初始化,并在内存中将实例对象的属性存储在实例对象的线性地址中(有兴趣的化可以去看看数据结构)。这样一来就可以通过实例对象直接访问实例属性。那么还是那个问题,定义类时,将所有的实例方法和类方法以及静态方法是定义在类对象中的。那么实例对象是如何访问到实例方法和类方法以及静态方法的呐?通过上图我们可以看到__class__属性的作用:当实例对象在自己的线性地址中找不到该实例方法时,会通过__class__属性去找到创建该实例对象的类对象,直接访问类对象中线性地址存储的属性和方法。这也就是实例对象可以调用实例方法和类方法以及静态方法及类属性的主要根本原因。

    然而可能又有疑问了,为什么类对象不能调用实例方法和实例属性呐?

        对于实例属性比较好解释:因为实例对象的属性是存储在实例对象的线性空间里,而类对象的__class__属性只能去找到创建该类对象的类对象的内存地址(可以理解为元类对象的内存地址),所以无法访问实例属性。

        对于实例方法哪啊?有人可能会问:“”实例方法不是存储在类对象中吗?为什么类对象不能访问?“”这就要说到关于修饰器,(在这里就不累述修饰器的概念了,我会专门分一片文章去讲解,有兴趣的可以关注一下,我的博客,我会不定期的更新一些文章,分享我的一些经验和体会。)在 类对象中如果要去访问方法时,类对象会找修饰器关键字即@staticmethod或者@classmethod,经修饰器修饰过的方法才能被类对象调用。因此实例方法无法被类对象去调用。

    总结:

        说到这里,不知道会不会对你的疑惑有所帮助,在这里我做一下简单的总结。

        所有的实例对象都必须有父类对象。

        所有的实例对象都是由  元类  或者  解释器内置的类对象  以及  自定义的类对象  创建出来。

        所有的对象都有__class__属性,是由创建对象时由解释器自动添加的属性。

        类属性、实例方法、类方法、静态方法在内存中只保存⼀份。

        实例属性在每个实例对象中都要保存⼀份。

        实例⽅法:由对象调⽤;⾄少⼀个self参数;执⾏实例⽅法时,⾃动将调
    ⽤该⽅法的对象赋值给self。
        类⽅法:由类调⽤; ⾄少⼀个cls参数;执⾏类⽅法时,⾃动将调⽤该⽅

    法的类赋值给cls。

    回顾上面图片中的代码,我们可以再去分析看看会不会有新的理解。


    展开全文
  • python中子类实例化调用父类方法

    千次阅读 2014-10-24 19:04:05
    面向对象的核心为对象对象是由类实例化而来的

    面向对象的核心为对象,对象是由类实例化而来的,那么类与类之间存在一个继承的关系,被继承的类叫做父类,继承了父类的类为子类。

    子类继承了父类,那么子类实例化的对象就可以调用所有父类的方法,当然也可以调用子类自身所有的方法。因为这些方法都属于该对象的方法。

    比如,子类child继承了父类father

    child.py

    from father import father
    class child(father):
        def childprint(self):
            print "this is a child"

    father.py

    class father:
        def common(self):
            print "this is a father also common"

    那么当子类的一个实例test = child()可以调用父类的common()方法,如下所示:

    third.py

    from child import child
    test = child()
    test.common()

    则运行third.py的结果为:


    但如果我们将father.py的文件做如下修改:

    father.py

    class father:
        def common(self):
            print "this is a father also common"
            self.childprint()


    则执行的结果如下:


    可以看到,“this is a child”也被打印了。很明显我们子类的一个实例调用了父类的common方法,而该方法里居然调用了子类的childprint方法。这是怎么回事?

    事实是这样子的,前面说过,子类实例化后,所有子类继承的父类的方法以及子类自身的方法都归该实例所有,那么此时的common方法自然是属于子类刚才实例化的对象,

    所有自然可以在common方法中调用子类的childprint方法。表面上看是父类调用子类方法,其实还是子类实例调用自己的方法。self.childprint()中的self指的就是子类实例。

    展开全文
  • Python中支持json进行数据封装的数据类型有str ,list,dict,如果想要对Python中实例化对象进行json数据封装时,一般采用将对象转化为字典类型,方法是调用dict(),但是前提必须给类提供俩个方法keys和 --getitem–,...
  • python类初始化属性在def init()定义,实例化对象后可直接调用 python类非初始化属性在def func()定义,实例化对象后,先调用调用函数,再调用属性 class Mdata(object): def __init__(self): self.mydata1 = ...
  • 一般来说,要使用某个类的方法,需要先实例化一个对象调用方法。 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。 这有利于组织代码,把某些应该属于某个类的函数给放到那个...
  • Python的解释器里,不仅有自己定义是对象,使我们传统意义上认为一切东西都是对象,对于执行的代码、函数、以及数据类型,你都可以在Python的源代码找到相应的类对象,因此他们也都是实例对象。在Python3,...
  • python使用反射机制实例化对象

    千次阅读 2018-01-19 22:06:44
    然后通过获取A的所有子类对象,用反射机制实例化对象,再调用数据查询的方法来完成所有类别的数据解析工作,这样如果再新增一个类别,只需要再添加一个A的子类对象即可。 例子: 项目结构如下:
  • class Node(object): # self 当我们实例化一个对象的情况下,再去调用这个函数的时候,这个实例就是self def __init__(self, data, next = None): self.data = data self.next = next class Stack(object):...
  • python类初始化属性在def __init__()定义,实例化对象后可直接调用 python类非初始化属性在def func()定义,实例化对象后,先调用调用函数,再调用属性 代码 class Mdata(object): def __init__(self): ...
  • 类的实例化 #建立一个Python类 class Python : # 下面定义了2个类变量 name = "安阳师范学院" add = "http://www.aynu.edu.cn/" # 定义一个类方法 该方法为类的构造方法 def __init__(self,name = "安阳师范...
  • python实例化理解

    千次阅读 2019-05-28 16:00:08
    让我们以一个Foo类开始: ...当你实例化它(即创建该类的一个新的实例)时发生了什么? f = Foo(1, y=2) 对Foo的调用到底调用了什么函数或方法呢?大多数新手甚至许多有经验的Python开发者会立...
  • 最近开始学习python,学习面向对象的知识时遇到一个问题 在创建实例对象时提示“TypeError: Employee() takes no arguments”,百度翻译了一下,意思是这个类的构造函数不接受参数     找了半天实在不理解...
  • 请问 类的对象调用另一个类的对象 是什么意思??? from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key...
  • 1.创建对象----为对象在内存分配空间; 2.初始方法(init)—为对象的属性设置初始值 初始方法:init,属于内置方法,指明一个对象初始的行为 创建一个初始方法例子: class Cat()...
  • python中一般对象进行实例化的方式就是先创建类,再创建一个对象赋值为类加括号,于是便可以对类的函数进行继承和调用。 如代码所示: class Foo1: def f1(self): print('111') obj1 = Foo1() obj1.f1 #...
  • Python3实例化方法和类方法

    千次阅读 2019-10-21 16:12:11
    class A(object): ... # 实例化方法(必须实例化类之后才能被调用) def func1(self): # self : 表示实例化类后的地址id print("func1") print(self) # 类方法(不需要实例化类就可以被类...
  • Qt C++调用Python方法以及类(类的实例化、成员函数调用前言环境配置参数传递调用Python方法调用Python类合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你...
  • python中类的创建和实例化

    万次阅读 2018-07-27 09:24:15
    python中实例化类不需要使用关键字new(也没有这个关键字),类的实例化类似函数调用方式; # coding: utf-8 # 创建一个类,类名称第一个字母大写,可以带括号也可以不带括号 class Student(): student_count =...
  • # 类对象 # 公有类属性 # 私有类属性 # 魔法方法 # 公有实例属性 # 私有实例属性 # 私有方法 # 公有方法
  • C++调用Python实例

    万次阅读 2017-02-15 13:54:54
    C++调用Python方法基本有以下几个步骤: 1、下载Python; 2、配置信息(本次我用的配置是VS2013+Python36),注意Python请下载32位的版本(即使你的操作系统是64位的),否则会函数未定义的错误 3、把Python加到VS...
  • 这篇文章主要介绍了Python面向对象程序设计类的定义、实例化、封装及私有变量/方法,结合具体实例形式较为详细的分析了Python面向对象程序设计类的定义、实例化、封装、私有变量、私有方法等相关使用技巧,需要的...
  • 理解python的类实例化

    万次阅读 2017-12-15 08:54:21
    英文原文来自Understanding Python Class Instantiation 从PythonWeekly邮件看到让我们以一个Foo类开始: class Foo(object): def __init__(self, x,...当你实例化它(即创建该类的一个新的实例)时发生了什么?f =
  • missing 1 required positional argument 使用类或类的函数之前,先对类进行实例化
  • callable可调用对象 对于这种可以被当做函数直接来调用对象,我们称为可调用对象,可调用对象的实现就是在他们内部要实现特殊的__call__()方法。 可调用对象的意义: 简化对象下方法的调用,比如说我们有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,699
精华内容 74,279
关键字:

python中实例化对象调用

python 订阅