Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Creating an instance when the argument is already an instance.
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  5 messages - Collapse all  -  Translate all to Translated (View all originals)
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Olive  
View profile  
 More options Jul 5 2012, 6:29 am
Newsgroups: comp.lang.python
From: Olive <di...@bigfoot.com>
Date: Thu, 5 Jul 2012 12:29:24 +0200
Local: Thurs, Jul 5 2012 6:29 am
Subject: Creating an instance when the argument is already an instance.
I am learning python -:)

I am creating a new class: package (to analyse the packages database in
some linux distros). I have created a class package such that
package("string") give me an instance of package if string is a correct
representation of a package. I would like that if pack is already an
instance of package then package(pack) just return pack.

This is exactly the behaviour of many of the built-in types. For
example:

[code]
[oesser@pcolivier ~]$ python2
Python 2.7.3 (default, Apr 24 2012, 00:06:13)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> a=complex(2,3)
>>> b=complex(a)
>>> a is b

True
[/code]

I note here that b is not a new instance of complex, it is another name
for a (as we can see with a is b). I would like to implement such
behaviour but I do not not how.

Olive


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Chris Angelico  
View profile  
 More options Jul 5 2012, 6:47 am
Newsgroups: comp.lang.python
From: Chris Angelico <ros...@gmail.com>
Date: Thu, 5 Jul 2012 20:47:52 +1000
Local: Thurs, Jul 5 2012 6:47 am
Subject: Re: Creating an instance when the argument is already an instance.

On Thu, Jul 5, 2012 at 8:29 PM, Olive <di...@bigfoot.com> wrote:
> I am creating a new class: package (to analyse the packages database in
> some linux distros). I have created a class package such that
> package("string") give me an instance of package if string is a correct
> representation of a package. I would like that if pack is already an
> instance of package then package(pack) just return pack.

One way would be to make the name "package" actually a wrapper
function, not the class itself:

>>> class _package:

        def __init__(self,arg):
                # blah blah
                self.asdf=arg

>>> def package(arg):

        if isinstance(arg,_package): return arg
        return _package(arg)

>>> a=package("Test")
>>> b=package(a)
>>> a is b

True

The leading underscore is a common convention meaning "private
implementation detail".

Chris Angelico


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Steven D'Aprano  
View profile  
 More options Jul 5 2012, 7:55 am
Newsgroups: comp.lang.python
From: Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info>
Date: 05 Jul 2012 11:55:33 GMT
Local: Thurs, Jul 5 2012 7:55 am
Subject: Re: Creating an instance when the argument is already an instance.

On Thu, 05 Jul 2012 12:29:24 +0200, Olive wrote:
> I am learning python -:)

> I am creating a new class: package (to analyse the packages database in
> some linux distros). I have created a class package such that
> package("string") give me an instance of package if string is a correct
> representation of a package. I would like that if pack is already an
> instance of package then package(pack) just return pack.

The built-in types only do this for immutable objects, those which cannot
be modified.

py> a = float('42.5')
py> b = float(a)
py> a is b
True

But note carefully that this is not a guarantee of the language. Other
versions of Python may not do this.

Also note carefully that it is only immutable objects which do this.
Mutable objects do not behave this way:

py> a = ['a', 1, None]
py> b = list(a)
py> a is b
False

By default, most custom-made classes are mutable, and so re-using
instances is the wrong thing to do. Unfortunately, it is moderately
tricky to make mutable classes in Python. One way is described here:

http://northernplanets.blogspot.com.au/2007/01/immutable-instances-in...

You can also look at the source code for Decimal (warning: it's BIG) or
Fraction:

http://hg.python.org/cpython/file/2.7/Lib/decimal.py
http://hg.python.org/cpython/file/2.7/Lib/fractions.py

But suppose you make your class immutable. Then it's quite safe, and
easy, to get the behaviour you want:

class Package(object):
    def __new__(cls, argument):
        if isinstance(argument, Package):
            return argument
        return object.__new__(cls, argument)

or similar, I haven't actually tested the above. But the important trick
is to use __new__, the constructor, rather than __init__, which runs
after the instance is already created, and to use an isinstance test to
detect when you already have an instance.

Good luck!

--
Steven


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Hans Mulder  
View profile  
 More options Jul 5 2012, 10:43 am
Newsgroups: comp.lang.python
From: Hans Mulder <han...@xs4all.nl>
Date: Thu, 05 Jul 2012 16:43:44 +0200
Local: Thurs, Jul 5 2012 10:43 am
Subject: Re: Creating an instance when the argument is already an instance.
On 5/07/12 12:47:52, Chris Angelico wrote:

I think using a factory function is the right idea, but the
code above doesn't solve the problem as stated.  Olive needs
a factory function that takes a string argument and returns
a _package object.

Maybe:

class _package:
    def __init__(self, name):
        self.name = name
         # etc.

packages = dict()

def package(name):
    if name not in packages:
        packages[name] = _package(name)
    return packages[name]

Hope this helps,

-- HansM


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Olive  
View profile  
 More options Jul 6 2012, 10:01 am
Newsgroups: comp.lang.python
From: Olive <di...@bigfoot.com>
Date: Fri, 6 Jul 2012 16:01:24 +0200
Local: Fri, Jul 6 2012 10:01 am
Subject: Re: Creating an instance when the argument is already an instance.
On 05 Jul 2012 11:55:33 GMT

Yes the trick with the __new__ works. We have to test afterwards i the
__init__ if the instance is already initialised and otherwise do
nothing. Thanks! I am learning and I didn't know the __new__ feature.

Olive


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
End of messages
« Back to Discussions « Newer topic     Older topic »