Skip to main content

getattrib, Setattrib, hasattrib and delattrib in python

# `getattr(object, name[, default])` Function in Python

The `getattr(object, name[, default])` function returns the value of a named attribute of an object, where `name` must be a string. If the object has an attribute with the specified `name`, then the value of that attribute is returned. On the other hand, if the object does not have an attribute with `name`, then the value of `default` is returned, or `AttributeError` is raised if `default` is not provided.

```python
>>> t = ('This', 'is', 'a', 'tuple')
>>> t.index('is')
1
>>> getattr(t, 'index')
<built-in method index of tuple object at 0x10c15e680>
>>> getattr(t, 'index')('is')
1
```

when the attribute is not defined,
```python
>>> getattr(t, 'len')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'len'
>>> getattr(t, 'len', t.count)
<built-in method count of tuple object at 0x10c15e680>
```

Besides "normal" objects like tuples, lists, and class instances, getattr also accepts modules as arguments. Since modules are also objects in Python, the attributes of modules can be retrieved just like any attribute in an object.

>>> import uuid >>> getattr(uuid, 'UUID') <class 'uuid.UUID'> >>> type(getattr(uuid, 'UUID')) <type 'type'> >>> isinstance(getattr(uuid, 'UUID'), type) True >>> callable(getattr(uuid, 'UUID')) True >>> getattr(uuid, 'UUID')('12345678123456781234567812345678') UUID('12345678-1234-5678-1234-567812345678')

*****
# check for existence of an attribute
# hasattr  #uses pythonic "Look Before You Leap" (LBYL) code style
>>> hasattr('abc', 'upper')
True
>>> hasattr('abc', 'lower')
True
>>> hasattr('abc', 'convert')
False

Using try-except way   # "Easier to Ask for Forgiveness than Permission" (EAFP) code style
>>> try:
...     'abc'.upper()
... except AttributeError:
...     print("abc does not have attribute 'upper'")
...
'ABC'
>>> try:
...     'abc'.convert()
... except AttributeError:
...     print("abc does not have attribute 'convert'")
...
abc does not have attribute 'convert'

**********

hasattr vs __dict__

>>> class A(object):
...   foo = 1
...
>>> class B(A):
...   pass
...
>>> b = B()
>>> hasattr(b, 'foo')
True
>>> 'foo' in b.__dict__
False


#setattrib --Assigns a value to the object’s attribute given its name.

EX: setattr(x, ‘foobar’, 123) is equivalent to x.foobar = 123

Example 1
>>> class Foo:
...     def __init__(self, x):
...         self.x = x
...
>>> f = Foo(10)
>>> f.x
10
>>> setattr(f, 'x', 20)
>>> f.x
20
>>> setattr(f, 'y', 10)
>>> f.y
10
>>> f.y = 100
>>> f.y
100
you can dynamically add a function as a method to a class
>>> def b(self):
            print 'bar'
class Foo:
    pass
f = Foo() print dir(f) #[‘__doc__’, ‘__module__’] setattr(Foo, ‘bar’, b) print dir(f) #[‘__doc__’, ‘__module__’, ‘bar’] f.bar() #bar
you can setattr() on an instance of a class that
inherits from "object", but you can't on an instance of "object"
itself
>>> o = object()
>>> setattr(o, "x", 1000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'x'
>>> class Object(object):pass ... >>> o = Object() >>> setattr(o, "x", 1000) >>> o.x 1000
If __setattr__() wants to assign to an instance attribute,
 it should not simply execute self.name = value — this would
 cause a recursive call to itself. Instead, it should insert
 the value in the dictionary of instance attributes,
 e.g., self.__dict__[name] = value.
 For new-style classes, rather than accessing the instance dictionary,
 it should call the base class method with the same name,
 for example, object.__setattr__(self, name, value).

 ****for blog****
The __slots__ declaration takes a sequence of instance variables and
 reserves just enough space in each instance to hold a value for each
 variable. Space is saved because __dict__ is not created for each instance.

 When there is '__slots__', there won't be '__dict__' and '__weakref__'


delattr will delete the attribute

Example:
class Box:
    pass
box = Box()
# Create a width attribute. setattr(box, "width", 15)
# The attribute exists. if hasattr(box, "width"):     print(True)
# Delete the width attribute. delattr(box, "width")
# Width no longer exists. if not hasattr(box, "width"):     print(False)

Comments

Popular posts from this blog

NSG 2.1 Tcl/OTcl Script Generator

Are you a beginner for ns2 network simulator? Are you afraid of Tcl/oTcl script generation? Then there is a tcl script generator, named NSG 2.1 NSG - Network Simulation Generator NSG 2.1 is a java .jar file.  So, this application can run on all platforms (windows/linux/mac os). It deserves the java installed in you pc, prior to working with NSG 2.1. Java must be installed to run NSG2.1. So, initially, java must be installed. How to install java in Windows/ubuntu/mint/debian linux/ OS X ? Step 1 : Go to Terminal and run  java -version   to check the java version installed in your machine. Step 2 :  For Windows, click here  to download the java installer. Then, it is a typical next-next windows executable installation. For ubuntu/mint/debian linux operating systems, run the following commands in that terminal: sudo apt-get install default-jre sudo apt-get install default-jdk sudo apt-get install openjdk-7-jre sudo apt-get install openjdk-7- jdk How to

SUMO installation in linux (Debian/Ubuntu/Mint)

SUMO - S imulation of U rban Mo bility SUMO an open source, portal, microscopic, multi-modal road traffic simulation. It allows for intermodal simulation including pedestrians and comes with a large set of tools for scenario creation.  It allows to simulate as to how a given traffic demand which consists of single vehicles moves through a given road network. The simulator allows to address a large set of traffic management topics. It is purely microscopic: each vehicle is modeled explicitly, has an own route, and moves individually through the network. SUMO Installation Procedure: Installation in Linux and mac OS Step I: Install two pre-requisite packages to build SUMO with GUI. Go to terminal and run: $ sudo apt-get install libgdal1-dev proj libxerces-c2-dev $ sudo apt-get install libfox-1.6-dev libgl1-mesa-dev libglu1-mesa-dev Step II: If you are using Unbuntu 12.04 or older versions, as it doesn't ship with libgdal package, create a symbolic link: $ sudo ln -s /usr/lib/li