Continue with the Basics by Example; today's version of the post written in IronPython Enjoy!
You can copy and paste the code below in your favorite IDE/Editor and start playing and learning with it. This little "working" program will teach you the basics of the Programming Language.
There are some "comments" on the code added just to tell you what are or how are some features called. In case you want to review the theory, you can read my previous post, where I give a definition of each of the concepts mentioned on the code. You can find it here: http://carlosqt.blogspot.com/2010/08/new-series-languages-basics-by-example.html
Greetings Program - Verbose
# IronPython Basics
import System
from System import Console, DateTime
class Greet(object):
# Fields of Attributes
__message = ''
__name = ''
__loopMessage = 0
# Properties
def getMessage(self):
return self.__message
def setMessage(self, value):
self.__message = self.__capitalize(value)
Message = property(getMessage, setMessage)
def getName(self):
return self.__name
def setName(self, value):
self.__name = self.__capitalize(value)
Name = property(getName, setName)
def getLoopMessage(self):
return self.__loopMessage
def setLoopMessage(self, value):
self.__loopMessage = value
LoopMessage = property(getLoopMessage, setLoopMessage)
# Constructor or Initializer Method
def __init__(self):
self.__message = ''
self.__name = ''
self.__loopMessage = 0
# Overloaded Constructor
# No Overloaded Constructors Support in Python
# Method 1
def __capitalize(self, val):
# "if-then-else" statement
if len(val) >= 1:
return val.capitalize()
else:
return ""
# Method 2
def salute(self):
# "for" statement
for i in range(0, self.__loopMessage):
print self.__message, self.__name + '!'
# Overloaded Method
# No Overloaded Methods Support in Python. New methods instead.
# Method 2.1
def salute21(self, message, name, loopMessage):
# "while" statement
i = 0
while i < loopMessage:
print self.__capitalize(message), self.__capitalize(name) + '!'
i = i + 1
# Method 2.2
def salute22(self, name):
# "switch/case" statement is not supported
# so I'm using if then else if...
dtNow = DateTime.Now
hh = dtNow.Hour
if hh in range(6,12):
self.__message = "good morning,"
elif hh in range(12,18):
self.__message = "good evening,"
elif hh in range(18,23):
self.__message = "good afternoon,"
elif hh == 23 or hh in range(0,6):
self.__message = "good night,"
else:
self.__message = "huh?"
print self.__capitalize(self.__message), self.__capitalize(name) + '!'
# Console Program
def main():
# Define variable object of type Greet
# Instantiate Greet. Call Constructor
g = Greet()
# Call Set Properties
g.Message = "hello"
g.Name = "world"
g.LoopMessage = 5
# Call Method 2
g.salute()
# Call Method 2.1 and Get Properties
g.salute21(g.Message, "ironPython", g.LoopMessage)
# Call Method 2.2
g.salute22("carlos")
# Stop and exit
print "Press any key to exit..."
Console.Read()
main()
Greetings Program - Minimal
# IronPython Basics
from System import Console, DateTime
class Greet(object):
# Fields of Attributes
__message = ''
__name = ''
__loopMessage = 0
# Properties
def getMessage(self):
return self.__message
def setMessage(self, value):
self.__message = self.__capitalize(value)
Message = property(getMessage, setMessage)
def getName(self):
return self.__name
def setName(self, value):
self.__name = self.__capitalize(value)
Name = property(getName, setName)
def getLoopMessage(self):
return self.__loopMessage
def setLoopMessage(self, value):
self.__loopMessage = value
LoopMessage = property(getLoopMessage, setLoopMessage)
# Constructor or Initializer Method
def __init__(self):
self.__message = ''
self.__name = ''
self.__loopMessage = 0
# Overloaded Constructor
# No Overloaded Constructors Support in Python
# Method 1
def __capitalize(self, val):
# "if-then-else" statement
if len(val) >= 1:
return val.capitalize()
else:
return ""
# Method 2
def salute(self):
# "for" statement
for i in range(0, self.__loopMessage):
print self.__message, self.__name + '!'
# Overloaded Method
# No Overloaded Methods Support in Python. New methods instead.
# Method 2.1
def salute21(self, message, name, loopMessage):
# "while" statement
i = 0
while i < loopMessage:
print self.__capitalize(message), self.__capitalize(name) + '!'
i = i + 1
# Method 2.2
def salute22(self, name):
# "switch/case" statement is not supported
# so I'm using if then else if...
dtNow = DateTime.Now
hh = dtNow.Hour
if hh in range(6,12):
self.__message = "good morning,"
elif hh in range(12,18):
self.__message = "good evening,"
elif hh in range(18,23):
self.__message = "good afternoon,"
elif hh == 23 or hh in range(0,6):
self.__message = "good night,"
else:
self.__message = "huh?"
print self.__capitalize(self.__message), self.__capitalize(name) + '!'
# Console Program
# Define variable object of type Greet
# Instantiate Greet. Call Constructor
g = Greet()
# Call Set Properties
g.Message = "hello"
g.Name = "world"
g.LoopMessage = 5
# Call Method 2
g.salute()
# Call Method 2.1 and Get Properties
g.salute21(g.Message, "ironPython", g.LoopMessage)
# Call Method 2.2
g.salute22("carlos")
# Stop and exit
print "Press any key to exit..."
Console.Read()
And the Output is:
Private Fields and Methods in (Iron)Python
"There is limited support for class-private identifiers. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, so it can be used to define class-private instance and class variables, methods, variables stored in globals, and even variables stored in instances. private to this class on instances of other classes.
Name mangling is intended to give classes an easy way to define 'private' instance variables and methods, without having to worry about instance variables defined by derived classes, or mucking with instance variables by code outside the class. Note that the mangling rules are designed mostly to avoid accidents; it still is possible for a determined soul to access or modify a variable that is considered private. This can even be useful in special circumstances, such as in the debugger, and that's one reason why this loophole is not closed. (Buglet: derivation of a class with the same name as the base class makes use of private variables of the base class possible.)". Taken from: "http://docs.python.org/release/2.5.2/tut/node11.html#SECTION0011600000000000000000"
print 'Private Access Modifier Example:'
class Greet(object):
# Fields of Attributes
__message = ''
__name = ''
__loopMessage = 0
# Constructor or Initializer Method
def __init__(self):
self.__message = ''
self.__name = ''
self.__loopMessage = 0
# Private Method
def __capitalize(self, val):
if len(val) >= 1:
return val.capitalize()
else:
return ""
# Public Method
def Salute(self):
for i in range(0, self.__loopMessage):
print self.__message, self.__name + '!'
g = Greet()
# publicly accessing private fields (_classname__fieldname)
g._Greet__message = "hello"
g._Greet__name = "world"
g._Greet__loopMessage = 5
# Call Public Method
g.Salute()
# Call Private Method (_classname__methodname)
print g._Greet__capitalize('capitalized!')
Where to define Class Fields/Attributes in (Iron)Python
print ''
print 'Class Attributes Example:'
class ClassAttributes(object):
# You do not need to explicitly add the Fields/Attributes as shown below within the class:
# message = ''
# name = ''
# loopMessage = 0
# because they are added to the class as Fields/Attributes the first time they appear in
# your code. For example, here below, in the Initialize method,
# we have 2 fields (name and message)
def __init__(self):
self.message = '' # class field
self.name = '' # class field
# and one more within a public method (loopMessage)
def Salute(self):
self.loopMessage = 0 # class field
localtest = 0 # local variable
# Then, you can access each of them as you normally do:
f = ClassAttributes()
f.message = 'Hello'
f.name = 'World'
f.loopMessage = 5
print f.message, f.name, f.loopMessage
Overloading Constructor and Methods in (Iron)Python
Python does not support Overloading Methods nor Constructors, instead, you can define one method with variable arguments and code the if-elif code to handle both(or multiple) cases yourself.
print ''
print 'Overloaded-like Constructor and Method Example:'
class Overloading(object):
# Constructor with variable arguments
def __init__(self, *args):
# if args list/sequence is not empty we use the arguments,
# otherwise we use the class fields
if args:
self.message = args[0]
self.name = args[1]
self.loopMessage = args[2]
else:
self.message = 'empty_message'
self.name = 'empty_name'
self.loopMessage = 2
# Method with variable arguments
def Salute(self, *args):
# if args list/sequence is not empty we use the arguments,
# otherwise we use the class fields
if args:
for i in range(0, args[2]):
print args[0], args[1] + '!'
else:
for i in range(0, self.loopMessage):
print self.message, self.name + '!'
# and now we use the "overloaded-like" constructor and method
# calling constructor without parameters
o1 = Overloading()
# calling method without parameters
o1.Salute()
# calling method with parameters
o1.Salute('Hello', 'IronPython', 3)
# calling constructor with with parameters
o2 = Overloading('Hello', 'Carlos', 2)
# calling method without parameters
o2.Salute()
And the Output is:


No comments:
Post a Comment