导航:首页 > 编程语言 > python绑定方法和未绑定方法

python绑定方法和未绑定方法

发布时间:2023-03-25 08:08:32

A. python动态绑定

是因为你的使用方法不对。这个方法是给实例绑定蚂粗方法用的,用来不会影响到其他实例:

classStu(object):
defset_age(self,age):
self.age=19
s=Stu()
a=Stu()
defset_age(self,age):
self.age=age
importtypes
a.set_age=types.MethodType(set_age,a)
a.set_age(15)
s.set_age(11)
print(s.age,a.age)#=>(19,15)

用MethodType方法更改闷态镇了实例a的set_age方法,同类实例s并不受影响。

如果要给你一个类绑定方法:

classStu(object):
pass
s=Stu()
a=Stu()
defset_age(self,age):
self.age=age
importtypes
Stu.set_age=set_age
a.set_age(15)
s.set_age(11)
print(s.age,a.age)

这样直接绑定就可以了闭做。

B. python如何把localhost绑定到127

无论是面向连接的网络通信还是面向无连接迅卜闷的网络通信的服务器程序,都需要首先将自己绑定到一个通信地址(如主机的 ip 地址和端口):

host = socket.gethostname() #获取本地主机名
port = 12345 #设置端口
s.bind((host, port)) #绑定端口
1
2
3
1
2
3
如弊携果服务器和客户都位于(不属于互联网络的)同一台亩弯机器,则可以绑定到本机局域网,即“127.0.01”或“localhost”:

host = 'localhost'
port = 12345
s.bind((host, port))
1
2
3
1
2
3

C. 【python】为何类中方法要有参数self

明明没有加入任何参数,为何会有 takes no arguments (1 given) ?

首先,关于实例属性和类属性都是同样的方法:

对于A(). app_func 的区别:

我们要的应该是单纯的function,并不是类A的绑定method,为什么会困中有这样的区别?

因为在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。

即当写入 app_func = func 相当于没有写self的绑定方法:

故调用A().func ()时,宴空解释器解释为A.func (A()),但是这个绑定方法并没有写self,故报错TypeError: func() takes no arguments (1 given)。晌尺瞎

D. python怎么查看object 里的成员变量

首先通过一个例子来看一下本文中可能用到的对象和相关概念。

  • #coding:utf-8import inspectprint inspect.ismole(inspect) #Trueprint inspect.isfunction(inspect.isfunction) #Trueprint inspect.isbuiltin(sorted) #Trueprint inspect.isroutine(sorted) #True

  • 对于实现了__call__的类实例,这个方法会返回False。如果目的是只要可以直接调用就需要是True的话,不妨使用isinstance(obj, collections.Callable)这种形式。我也不知道为什么Callable会在collections模块中,抱歉!我猜大概是因为collections模块中包含了很多其他的ABC(Abstract Base Class)的缘故吧:)

  • #coding:utf-8import collectionsclass Dog(object): def __call__(self, name):#实现__call__方法就可以直接调用对象了

  • print 'i am a dog named ' , name


  • dog = Dog()

  • dog('DaHuang')print isinstance(dog, collections.Callable) #Trueprint dog.__class__.__bases__

  • 3.2. 获取对象信息

  • getmembers(object[, predicate]):这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), ...]。另外,predicate是一个方法的引用,如果指定,则应当接受value作为参数并返回一个布尔值,如果为False,相应的属性将不会返回。使用is*作为第二个参数可以过滤出指定类型的属性。

  • getmole(object):还在为第2节中的__mole__属性只返回字符串而遗憾吗?这个方法一定可以满足你,它返回object的定义所在的模块对象。

  • get{file|sourcefile}(object):获取object的定义所在的模块的文件名|源代码文件名(如果没有则返回None)。用于内建的对象(内建模块、类、函数、方法)上时会抛出TypeError异常。

  • get{source|sourcelines}(object):获取object的定义的源代码,以字符串|字符串行表返回。代码无法访问时会抛出IOError异常。只能用于

  • E. python中怎样判断一个文件的类型

    这种方法叫做调用父类的未绑定的构造方法。在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(称为绑定方法)。
    但如果直接调用类的方法(比如A.__init),那么就没有实例会被绑定。这样就可以自由的提供需要的self参数,这种方法称为未绑定unbound方法。

    F. python中textvariable作用

    文本变量。
    在Button,Lable,Entry这3个组件蠢握,有一个属性:textvariable这个属性绑定一个变量后,带友庆它们的Text就会以变量方法来呈现。
    绑定方法很简单,就是先建立一个变量,假如取变量名为var,然后在创建组件时,用textvariable来告毁绑定这个变量:textvariable=var然后,要设置变量就是var.set(设置值)。

    G. 如何在Python中使用static,class,abstract方法

    方法在Python中是如何工作的

    方法就是一个函数,它作为一个类属性而存在,你可以用如下方式来声明、访问一个函数:

    Python

    >>> class Pizza(object):
    ... def __init__(self, size):
    ... self.size = size
    ... def get_size(self):
    ... return self.size
    ...
    >>> Pizza.get_size
    <unbound method Pizza.get_size>

    Python在告诉你,属性_get_size是类Pizza的一个未绑定方法。这是什么意思呢?很快我们就会知道答案:

    Python

    >>> Pizza.get_size()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <mole>
    TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)

    我们不能这么调用,因为它还没有绑定到Pizza类的任何实例上,它需要一个实例作为第一个参数传递进去(Python2必须是该类的实例,Python3中可以是任何东西),尝试一下:

    Python

    >>> Pizza.get_size(Pizza(42))
    42

    >>> Pizza.get_size(Pizza(42))
    42

    太棒了,现在用一个实例作为它的的第一个参数来调用,整个世界都清静了,如果我说这种调用方式还不是最方便的,你也会这么认为的;没错,现在每次调用这个方法的时候我们都不得不引用这个类,如果不知道哪个类是我们的对象,长期看来这种方式是行不通的。

    那么Python为我们做了什么呢,它绑定了所有来自类_Pizza的方法以及该类的任何一个实例的方法。也就意味着现在属性get_size是Pizza的一个实例对象的绑定方法,这个方法的第一个参数就是该实例本身。

    Python

    >>> Pizza(42).get_size
    <bound method Pizza.get_size of <__main__.Pizza object at 0x7f3138827910>>
    >>> Pizza(42).get_size()
    42

    和我们预期的一样,现在不再需要提供任何参数给_get_size,因为它已经是绑定的,它的self参数会自动地设置给Pizza实例,下面代码是最好的证明:

    Python

    >>> m = Pizza(42).get_size
    >>> m()
    42

    更有甚者,你都没必要使用持有Pizza对象的引用了,因为该方法已经绑定到了这个对象,所以这个方法对它自己来说是已经足够了。

    也许,如果你想知道这个绑定的方法是绑定在哪个对象上,下面这种手段就能得知:

    Python

    >>> m = Pizza(42).get_size
    >>> m.__self__
    <__main__.Pizza object at 0x7f3138827910>
    >>> # You could guess, look at this:
    ...
    >>> m == m.__self__.get_size
    True

    显然,该对象仍然有一个引用存在,只要你愿意你还是可以把它找回来。

    在Python3中,依附在类上的函数不再当作是未绑定的方法,而是把它当作一个简单地函数,如果有必要它会绑定到一个对象身上去,原则依然和Python2保持一致,但是模块更简洁:

    Python

    >>> class Pizza(object):
    ... def __init__(self, size):
    ... self.size = size
    ... def get_size(self):
    ... return self.size
    ...
    >>> Pizza.get_size
    <function Pizza.get_size at 0x7f307f984dd0>

    静态方法

    静态方法是一类特殊的方法,有时你可能需要写一个属于这个类的方法,但是这些代码完全不会使用到实例对象本身,例如:

    Python

    class Pizza(object):
    @staticmethod
    def mix_ingredients(x, y):
    return x + y

    def cook(self):
    return self.mix_ingredients(self.cheese, self.vegetables)

    这个例子中,如果把_mix_ingredients作为非静态方法同样可以运行,但是它要提供self参数,而这个参数在方法中根本不会被使用到。这里的@staticmethod装饰器可以给我们带来一些好处:

    Python不再需要为Pizza对象实例初始化一个绑定方法,绑定方法同样是对象,但是创建他们需要成本,而静态方法就可以避免这些。

    Python

    >>> Pizza().cook is Pizza().cook
    False
    >>> Pizza().mix_ingredients is Pizza.mix_ingredients
    True
    >>> Pizza().mix_ingredients is Pizza().mix_ingredients
    True

    可读性更好的代码,看到@staticmethod我们就知道这个方法并不需要依赖对象本身的状态。
    可以在子类中被覆盖,如果是把mix_ingredients作为模块的顶层函数,那么继承自Pizza的子类就没法改变pizza的mix_ingredients了如果不覆盖cook的话。

    类方法

    话虽如此,什么是类方法呢?类方法不是绑定到对象上,而是绑定在类上的方法。

    Python

    >>> class Pizza(object):
    ... radius = 42
    ... @classmethod
    ... def get_radius(cls):
    ... return cls.radius
    ...
    >>>
    >>> Pizza.get_radius
    <bound method type.get_radius of <class '__main__.Pizza'>>
    >>> Pizza().get_radius
    <bound method type.get_radius of <class '__main__.Pizza'>>
    >>> Pizza.get_radius is Pizza().get_radius
    True
    >>> Pizza.get_radius()
    42

    无论你用哪种方式访问这个方法,它总是绑定到了这个类身上,它的第一个参数是这个类本身(记住:类也是对象)。

    什么时候使用这种方法呢?类方法通常在以下两种场景是非常有用的:

    工厂方法:它用于创建类的实例,例如一些预处理。如果使用@staticmethod代替,那我们不得不硬编码Pizza类名在函数中,这使得任何继承Pizza的类都不能使用我们这个工厂方法给它自己用。

    Python

    class Pizza(object):
    def __init__(self, ingredients):
    self.ingredients = ingredients

    @classmethod
    def from_fridge(cls, fridge):
    return cls(fridge.get_cheese() + fridge.get_vegetables())

    调用静态类:如果你把一个静态方法拆分成多个静态方法,除非你使用类方法,否则你还是得硬编码类名。使用这种方式声明方法,Pizza类名明永远都不会在被直接引用,继承和方法覆盖都可以完美的工作。

    Python

    class Pizza(object):
    def __init__(self, radius, height):
    self.radius = radius
    self.height = height

    @staticmethod
    def compute_area(radius):
    return math.pi * (radius ** 2)

    @classmethod
    def compute_volume(cls, height, radius):
    return height * cls.compute_area(radius)

    def get_volume(self):
    return self.compute_volume(self.height, self.radius)

    抽象方法

    抽象方法是定义在基类中的一种方法,它没有提供任何实现,类似于Java中接口(Interface)里面的方法。

    在Python中实现抽象方法最简单地方式是:

    Python

    class Pizza(object):
    def get_radius(self):
    raise NotImplementedError

    任何继承自_Pizza的类必须覆盖实现方法get_radius,否则会抛出异常。

    这种抽象方法的实现有它的弊端,如果你写一个类继承Pizza,但是忘记实现get_radius,异常只有在你真正使用的时候才会抛出来。

    Python

    >>> Pizza()
    <__main__.Pizza object at 0x7fb747353d90>
    >>> Pizza().get_radius()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <mole>
    File "<stdin>", line 3, in get_radius
    NotImplementedError

    还有一种方式可以让错误更早的触发,使用Python提供的abc模块,对象被初始化之后就可以抛出异常:

    Python

    import abc

    class BasePizza(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def get_radius(self):
    """Method that should do something."""

    使用abc后,当你尝试初始化BasePizza或者任何子类的时候立马就会得到一个TypeError,而无需等到真正调用get_radius的时候才发现异常。

    Python

    >>> BasePizza()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <mole>
    TypeError: Can't instantiate abstract class BasePizza with abstract methods get_radius

    混合静态方法、类方法、抽象方法

    当你开始构建类和继承结构时,混合使用这些装饰器的时候到了,所以这里列出了一些技巧。

    记住,声明一个抽象的方法,不会固定方法的原型,这就意味着虽然你必须实现它,但是我可以用任何参数列表来实现:

    Python

    import abc

    class BasePizza(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def get_ingredients(self):
    """Returns the ingredient list."""

    class Calzone(BasePizza):
    def get_ingredients(self, with_egg=False):
    egg = Egg() if with_egg else None
    return self.ingredients + egg

    这样是允许的,因为Calzone满足BasePizza对象所定义的接口需求。同样我们也可以用一个类方法或静态方法来实现:

    Python

    import abc

    class BasePizza(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def get_ingredients(self):
    """Returns the ingredient list."""

    class DietPizza(BasePizza):
    @staticmethod
    def get_ingredients():
    return None

    这同样是正确的,因为它遵循抽象类BasePizza设定的契约。事实上get_ingredients方法并不需要知道返回结果是什么,结果是实现细节,不是契约条件。

    因此,你不能强制抽象方法的实现是一个常规方法、或者是类方法还是静态方法,也没什么可争论的。从Python3开始(在Python2中不能如你期待的运行,见issue5867),在abstractmethod方法上面使用@staticmethod和@classmethod装饰器成为可能。

    Python

    import abc

    class BasePizza(object):
    __metaclass__ = abc.ABCMeta

    ingredient = ['cheese']

    @classmethod
    @abc.abstractmethod
    def get_ingredients(cls):
    """Returns the ingredient list."""
    return cls.ingredients

    别误会了,如果你认为它会强制子类作为一个类方法来实现get_ingredients那你就错了,它仅仅表示你实现的get_ingredients在BasePizza中是一个类方法。

    可以在抽象方法中做代码的实现?没错,Python与Java接口中的方法相反,你可以在抽象方法编写实现代码通过super()来调用它。(译注:在Java8中,接口也提供的默认方法,允许在接口中写方法的实现)

    Python

    import abc

    class BasePizza(object):
    __metaclass__ = abc.ABCMeta

    default_ingredients = ['cheese']

    @classmethod
    @abc.abstractmethod
    def get_ingredients(cls):
    """Returns the ingredient list."""
    return cls.default_ingredients

    class DietPizza(BasePizza):
    def get_ingredients(self):
    return ['egg'] + super(DietPizza, self).get_ingredients()

    这个例子中,你构建的每个pizza都通过继承BasePizza的方式,你不得不覆盖get_ingredients方法,但是能够使用默认机制通过super()来获取ingredient列表。

    H. python 类不绑定属性

    没什么影响,就是一个空陆尺猜类,如下你就可以理困判解早型了

    I. 如何将notepad绑定Python文件

    如何将notepad绑定Python文件

    notepad是Windows下的记事本软件,将Python文件绑定到记事本的方法如下:

    推荐学习《Python教程》。

    1、创建一个文本文档,改仿慧谨名为test.py

    如果安装了Python解析器,碧喊则图标是这样的

    2、右键test.py文件,选择打开方式-选择其他应用

    3、选择记事备基本,勾选始终使用此应用打开.py文件即可

    J. python怎么绑定窗口句柄

    1、首先。点击进入点击设置,进入窗口设置汪运。
    2、其次。点击绑定搞到大数据窗口绑定,闭扰然后找找到python然后点击绑定窗口句柄。
    3、最后。点击困态梁确定,python绑定窗口句柄就可以了。

    阅读全文

    与python绑定方法和未绑定方法相关的资料

    热点内容
    为什么我的世界天空服务器进不去 浏览:260
    钉钉直播后的视频如何线上加密 浏览:501
    听主的命令 浏览:206
    全民上云时代云服务器 浏览:519
    iphone不创建id如何下载app 浏览:970
    windowsphp扩展安装 浏览:93
    emacslinux配置文件 浏览:379
    python3在线教程 浏览:114
    不小心删文件夹的文件 浏览:480
    java获取手机IP 浏览:816
    手机rar解压密码获取 浏览:344
    程序员被辞退工资怎么处理 浏览:494
    恋活的模型没加密 浏览:159
    如何把安卓机的微信转移苹果 浏览:583
    爬山算法相关题目 浏览:724
    vc编程大全 浏览:118
    excel表格单列数据加密 浏览:648
    给同事的解压话语 浏览:993
    linux关闭网卡命令行 浏览:455
    史上最漂亮程序员 浏览:771