473,385 Members | 2,180 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

Looking for assignement operator

Hello,

is there a assignement operator, that i can overwrite?

class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
self._val = val

a = MyInt(10)

# Here i need to overwrite the assignement operator
a = 12
Thanks
Alexander
Oct 17 '06 #1
17 1453
On 10/17/06, Alexander Eisenhuth <ne******@stacom-software.dewrote:
Hello,

is there a assignement operator, that i can overwrite?
Soirry, no, assignment is a statement, not an operator, and can't be overridden.

--
Cheers,
Simon B
si***@brunningonline.net
http://www.brunningonline.net/simon/blog/
Oct 17 '06 #2

Alexander Eisenhuth wrote:
Hello,

is there a assignement operator, that i can overwrite?
You can't overwrite assignment operator, but you can
overwrite methods of numeric objects:

http://docs.python.org/ref/numeric-types.html

HTH,
Rob

Oct 17 '06 #3
Alexander Eisenhuth a écrit :
Hello,

is there a assignement operator, that i can overwrite?
Adding to Simon Brunning reply (assignment is a statement).
class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
self._val = val

a = MyInt(10)

# Here i need to overwrite the assignement operator
a = 12
Here you bind the 12 (Python int value) to name 'a', then 'a' has the
int type, not your MyInt (which value has been lost).

You may define a 'set' method, and write:
a = MyInt(10)
a.set(12)

And, if a is a member of another class, you may define an accessor for
that 'a' member in that class, which automatically call your set method
when giving an int value.

b.a = MyInt(10)
b.a = 12 ---b.a.set(12)

A+

Laurent.
Oct 17 '06 #4
On Tue, 17 Oct 2006 15:50:47 +0200, Alexander Eisenhuth wrote:
Hello,

is there a assignement operator, that i can overwrite?
No.

We were just discussing the reasons why Python will not and can not have
an assignment operator just a few days ago. Check the archives for more
details.

class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
isinstance() considered harmful:

http://www.canonical.org/~kragen/isinstance/
self._val = val
Seems kind of pointless. What does MyInt do that ordinary ints don't?
Apart from slow your program down and require extra programming effort.
a = MyInt(10)

# Here i need to overwrite the assignement operator a = 12
Can't happen. "a" is just a name, not an object with methods that can be
called. "a" can be bound to anything, not just MyInt instances. Objects
like MyInt(10) can have no name, one name or many names:

mylist = [0, MyInt(10), 20, 30] # MyInt instance has no name
x = MyInt(10) # MyInt instance has one name
x = y = z = MyInt(10) # MyInt instance has many names

--
Steven.

Oct 17 '06 #5


On Oct 17, 8:50 am, Alexander Eisenhuth <newsu...@stacom-software.de>
wrote:
Hello,

is there a assignement operator, that i can overwrite?

class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
self._val = val

a = MyInt(10)

# Here i need to overwrite the assignement operator
a = 12

Thanks
Alexander
I believe the property function is what you are looking for. e.g.

class MyClass:
def __init__(self, val):
self.setval(val)

def getval(self):
return self._val

def setval(self, val):
assert(isinstance(val, int))
self._val = val

_val = property(self.getval, self.setval)

--
Jerry

Oct 17 '06 #6
Steven D'Aprano wrote:
On Tue, 17 Oct 2006 15:50:47 +0200, Alexander Eisenhuth wrote:
>Hello,

is there a assignement operator, that i can overwrite?

No.

We were just discussing the reasons why Python will not and can not have
an assignment operator just a few days ago. Check the archives for more
details.

>class MyInt:
def __init__(self, val):
assert(isinstance(val, int))

isinstance() considered harmful:
Trying to convert val to an int would probably be better indeed:

class MyInt(object):
def __init__(self, val):
self.val = int(val)

My 2 cents
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Oct 17 '06 #7
Jerry wrote:
(snip)
I believe the property function is what you are looking for.
It is not.
e.g.

class MyClass:
Descriptors don't work fine with old-style classes. Should be:

class MyClass(object):
def __init__(self, val):
self.setval(val)

def getval(self):
return self._val

def setval(self, val):
assert(isinstance(val, int))
self._val = val

_val = property(self.getval, self.setval)
NameError : self is not defined.
Should be :
_val = property(getval, setval)

but then - since setval() now calls _vals.__set__(), which itself calls
setval(), you have a nice infinite recursion (well, almost infinite -
hopefully, Python takes care of it).

May I kindly suggest that you learn more about properties and test your
code before posting ?-)

Anyway, even with the following correct code, this won't solve the OP's
question:
class MyClass(object):
def __init__(self, val):
self.val = val

def _getval(self):
return self._val

def _setval(self, val):
self._val = int(val)

val = property(_getval, _setval)
m = MyClass(42)
m
=<__main__.MyClass object at 0x2ae5eaa00410>
m.val
=42
m = 42
m
=42
type(m)
=<type 'int'>
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Oct 17 '06 #8
Wow, thanks a lot for your quick answers.

That assignement is no operator, but a statemant is a pity, but indeed I came
foward with overwritten methods for numeric types

Regards
Alexander
Oct 17 '06 #9
class MyClass:Descriptors don't work fine with old-style classes.
Interesting, I have used this construct before in Python 2.4.3 and not
run into the recursion problem you talk about. Also, it has worked
fine for me. Perhaps you can post a link to your source so that I
could study it and understand what circumstances my solution works and
what the recommended construct actually is.
May I kindly suggest that you learn more about properties and test your
code before posting ?-)
I did test this on Python 2.4.3 in Mac OS X 10.4 and it worked fine.

--
Jerry

Oct 17 '06 #10
Jerry wrote:
>class MyClass:Descriptors don't work fine with old-style classes.
Interesting, I have used this construct before in Python 2.4.3 and not
run into the recursion problem you talk about.
The recursion problem doesn't occur with you original code (for the good
reason that there's a name error way before). It doesn't even occur when
the cause of the name error is corrected, since the first (explicit)
call to setval() in the __init__ rebind self._val to the value passed -
so the property is in fact *never* used.
Also, it has worked
fine for me.
For a very peculiar definition of "works fine" !-)
Perhaps you can post a link to your source
class MyClass:
def __init__(self, val):
self.setval(val)
print "in __init__, after setval(): self._val is %s" \
% type(self._val)

def getval(self):
print "in getval - you won't see me unless you explicitely call
getval"
return self._val

def setval(self, val):
print "in setval"
self._val = val
print "you wont see me no more unless you explicitely call setval"

_val = property(getval, setval)

so that I
could study it and understand what circumstances my solution works
It doesn't work in any circumstances.
and
what the recommended construct actually is.
class MyWorkingClass(object):
def __init__(self, val):
self.val = val

def _setval(self, val):
print "_setval to %s" % val
self._val = val

def _getval(self):
print "_getval"
return self._val

val = property(_getval, _setval)

>May I kindly suggest that you learn more about properties and test your
code before posting ?-)
I did test this on Python 2.4.3 in Mac OS X 10.4 and it worked fine.
Here's the exact code you posted:

class MyClass:
def __init__(self, val):
self.setval(val)

def getval(self):
return self._val

def setval(self, val):
assert(isinstance(val, int))
self._val = val

_val = property(self.getval, self.setval)

And here's the result:

Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/tmp/python-30955cPK.py", line 1, in ?
class MyClass:
File "/usr/tmp/python-30955cPK.py", line 15, in MyClass
_val = property(self.getval, self.setval)
NameError: name 'self' is not defined
HTH
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Oct 17 '06 #11
Okay, very well, then I put a couple of extra 'self' identifiers in
there when I hand-copied the code over. That would be my mistake for
letting my fingers do the walking and forgetting my brain. Is there
anything else wrong with my code?

--
Jerry

Oct 17 '06 #12
Jerry wrote:
Okay, very well, then I put a couple of extra 'self' identifiers in
there when I hand-copied the code over.
You should try copy/paste - it's both safer and less work !-)
That would be my mistake for
letting my fingers do the walking and forgetting my brain. Is there
anything else wrong with my code?
You mean something I didn't cover in my 2 previous posts ?

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Oct 17 '06 #13
Could the "traits" package be of help?

http://code.enthought.com/traits/

Alexander Eisenhuth wrote:
Hello,

is there a assignement operator, that i can overwrite?

class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
self._val = val

a = MyInt(10)

# Here i need to overwrite the assignement operator
a = 12
Thanks
Alexander
Oct 18 '06 #14
Tommi wrote:
(please don't top-post - corrected)
>

Alexander Eisenhuth wrote:
>Hello,

is there a assignement operator, that i can overwrite?

class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
self._val = val

a = MyInt(10)

# Here i need to overwrite the assignement operator
a = 12
Could the "traits" package be of help?

http://code.enthought.com/traits/
How could it help ?

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Oct 18 '06 #15
Bruno Desthuilliers wrote:
Tommi wrote:
(please don't top-post - corrected)
>>
Alexander Eisenhuth wrote:
>>Hello,

is there a assignement operator, that i can overwrite?

class MyInt:
def __init__(self, val):
assert(isinstance(val, int))
self._val = val

a = MyInt(10)

# Here i need to overwrite the assignement operator
a = 12
>Could the "traits" package be of help?

http://code.enthought.com/traits/

How could it help ?
It doesn't. (I am an Enthought developer.)

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco

Oct 18 '06 #16

Bruno Desthuilliers wrote:
(please don't top-post - corrected)
(sorry)

How could it help ?
To me they just looked a bit alike:

--- op's example ---
a = MyInt(10)
# Here i need to overwrite the assignement operator
a = 12

--- traits' example ---
moe = Child()
# NOTIFICATION in action
moe.age = 10

Oct 21 '06 #17
Tommi wrote:
Bruno Desthuilliers wrote:
(about Traits)
>
>How could it help ?

To me they just looked a bit alike:

--- op's example ---
a = MyInt(10)
# Here i need to overwrite the assignement operator
a = 12

--- traits' example ---
moe = Child()
# NOTIFICATION in action
moe.age = 10
You do understand the difference between rebinding a name and modifying
a mutable object, do you ?

FWIW, you definitively don't need Traits here - properties are enough.

class Something(object):
@apply
def age():
def fget(self):
return self._age
def fset(self, val):
self._age = MyInt(val)
return property(**locals())

s = Something()
s.age = 42
type(s.age)

But this is not what the OP was asking for...

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'o****@xiludom.gro'.split('@')])"
Oct 25 '06 #18

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: Harald Massa | last post by:
Old, very old informatical problem: I want to "print" grouped data with head information, that is: eingabe= shall give: ( Braces are not important...) 'Stuttgart', '70197' --data--...
16
by: yuraukar | last post by:
I am trying to create a garbage collection class in C++ to collect instances of a specific class (so no general gc). The approach is to use smart pointers and a mark and a simple sweep gc. ...
3
by: sushant | last post by:
hi all, whats the difference between assignement and initialisation in C. is assignement related with scanf() and initialisation with (int x=10;) sushant
5
by: Jim Langston | last post by:
I've been working on a project to map a MySQL database to a C++ class. Well, I actually got it to work, but some if it I just feel is exceptionally ugly. For example, in my operator<< override: ...
4
by: mscava | last post by:
I'm building DataManager<T>. A class where shared data will be stored. One of things useful to implement is garbage collection. But it still gives me this error: stl_algo.h:1076: error:...
4
by: sublimanized | last post by:
Hello all ... here is my problem. I just got the book "Teach Yourself C ++ in 21 Days" Setup: Fedora Core 6 - i386 GCC 4.1.1 Again, I am a complete newcomer to C++, and this is one of the...
4
by: mihai | last post by:
I work at an application witch has embeded python. We have an python type X. # a != b a = b # at this point both variables have the same value b = select_other()
5
by: mosfet | last post by:
Hi, In one my class I would like to give access to one of my buffer so I have declared something like this : vector<char>& RespData = pWebResp->get_RawBuffer(); The problem is caller can...
7
by: John Doe | last post by:
Hi, I am trying to replace the use of the Windows CString class by a compatible one (CStdString) using std::string , the problem is I cannot do the following thing : A) CString strFullPath;...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.