1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"><head> 3<title>Beginning Python Tutorial (Part 12) - GIDNetwork</title> 4<meta name="generator" content="GIDTemplate 2.0" /> 5<meta name="copyright" content="J de Silva" /> 6<meta name="description" content="Beginner's tutorial on Python OOP and using classes" /> 7<meta name="keywords" content="OOP,, classes,, Python,, beginner,, tutorial,, walkthrough,, programming,, objects" /> 8<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> 9<link rel="stylesheet" href="/global.css" type="text/css" title="GID Default" /> 10<link rel="stylesheet" href="/gid_default.css" type="text/css" title="GID Default" /> 11<link rel="shortcut icon" href="/favicon.ico" /> 12<link rel="start" href="http://www.gidnetwork.com/" title="GIDNetwork - Everything's connected now." /><link rel="next" href="/b-138.html" title="JSP Power Debugger" /><link rel="prev" href="/b-136.html" title="Optimising GIDForums for Search Engines" /><link rel="alternate" href="http://www.gidnetwork.com/xml/gidnetwork-latest.rss" type="application/rss+xml" title="GIDNetwork's Most Recent" />
12<script type="text/javascript" src="/global.js"></script>
vendor: 2 bytes, line 12
12
13<script type="text/javascript" src="http://www.google-analytics.com/urchin.js"></script>
vendor: 2 bytes, line 13
13
14<script type="text/javascript"><!-- 15_uacct = "UA-55009-3"; urchinTracker(); //--></script>
vendor: 2 bytes, line 15
15
16<script type="text/javascript"><!-- 17var googletag = googletag || {}; 18googletag.cmd = googletag.cmd || []; 19(function() { 20var gads = document.createElement('script'); 21gads.async = true; 22gads.type = 'text/javascript'; 23var useSSL = 'https:' == document.location.protocol; 24gads.src = (useSSL ? 'https:' : 'http:') + 25'//www.googletagservices.com/tag/js/gpt.js'; 26var node = document.getElementsByTagName('script')[0]; 27node.parentNode.insertBefore(gads, node); 28})(); 29 //--></script>
vendor: 2 bytes, line 29
29
30<script type="text/javascript"><!-- 31var vWidth, vHeight; 32 33if (window.innerWidth < 728) { 34 vWidth = 468; vHeight = 60; 35} 36else if (window.innerWidth < 970) { 37 vWidth = 728; vHeight = 90; 38} 39else { 40 vWidth = 970; vHeight = 90; 41} 42googletag.cmd.push(function() { 43googletag.defineSlot('/1003336/gidnetwork_'+vWidth+'_'+vHeight+'_top', [vWidth, vHeight], 'div-gpt-ad-top').addService(googletag.pubads()); 44googletag.pubads().enableSingleRequest(); 45googletag.enableServices(); 46}); 47 //--></script>
47 48</head> 49 50<body> 51 <!-- Piwik -->
52<script type="text/javascript"> 53 var _paq = _paq || []; 54 _paq.push(["setCookieDomain", "*.gidnetwork.com"]); 55 _paq.push(["setDomains", ["*.gidnetwork.com"]]); 56 _paq.push(['trackPageView']); 57 _paq.push(['enableLinkTracking']); 58 (function() { 59 var u="https://pwk.gidnetwork.com/"; 60 _paq.push(['setTrackerUrl', u+'piwik.php']); 61 _paq.push(['setSiteId', 3]); 62 var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 63 g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); 64 })(); 65</script>
65 66<!-- /Piwik --> 67<a name="top" id="top"></a> 68<div id="pg"> 69 <table id="l1" cellspacing="0" cellpadding="0" border="0"> 70 <tr> 71 <td rowspan="2" id="logo"><a href="http://www.gidnetwork.com/"><img src="/images/gidnetwork_logo.gif" alt="GIDNetwork Logo" title="GIDNetwork Homepage" /></a></td> 72 <td id="logoadspace"> </td> 73 </tr> 74 <tr> 75 <td id="logoband"> </td> 76 </tr> 77 <tr> 78 <td colspan='2'> 79 <div id='div-gpt-ad-top'>
79<script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-top'); });</script>
79</div> 80 <div class='logogradient'> </div> 81 </td> 82 </tr> 83 <tr> 84 <td colspan="2" id="gidsearchbar"><table id="topnav" cellspacing="0" cellpadding="0" border="0"> 85 <tr> 86 <td id="topnavbc"> 87 <a href="/">GIDNetwork</a> > Beginning Python Tutorial (Part 12) 88 </td> 89 90 <td id="topnavbl" title="Please log in"> 91 <form method="post" action="/login.php" onsubmit="md5hash(vb_login_password,vb_login_md5password,vb_login_md5password_utf)"> 92
92<script type="text/javascript" src="http://www.gidforums.com/clientscript/vbulletin_md5.js"></script>
92 93 <span><a href="http://www.gidforums.com/register.php" rel="nofollow">Register</a></span> 94 <input type="text" name="username" id="username" value="username" onfocus="if( this.value=='username' ) this.value=''; vb_login_password.value=''" maxlength="16" /> 95 <input type="password" name="vb_login_password" id="vb_login_password" value="12345678" /> 96 <input type="submit" id="login" name="login" value="login" /> 97 </form> 98 99 </td> 100 <td id="topnavbs"> 101 <form id="gidsearch" name="gidsearch" method="get" action="http://www.gidsearch.com/"> 102 <input type="text" name="q" id="q" accesskey="s" maxlength="255" title="Enter your search phrase or keywords" /> 103 <input type="submit" value="GIDSearch" /> 104 </form> 105 </td> 106 </tr> 107</table></td> 108 </tr> 109 </table> 110 111 <table class="np"> 112 <tr> 113 <td class="npl"><span class="larger bolder">«</span> <a href="/b-136.html" title="View PREVIOUS blog">Optimising GIDForums for Search Engines</a></td> 114 <td class="npr"><a href="/b-138.html" title="View NEXT blog">JSP Power Debugger</a> <span class="larger bolder">»</span></td> 115 </tr> 116 </table> 117 <table id="l2" cellspacing="0" cellpadding="0" border="0"> 118 <tr> 119 <td id="mblog"> 120 <h1>Beginning Python Tutorial (Part 12)</h1> 121 <div id="byline"> 122 by: <a href="http://crystalattice.gidblog.com" target="_blank">crystalattice</a> - Jul 26, 2007 123 124 </div> 125 <div class="KonaBody"><h2>Getting Classier</h2><p>The last time we met I told you some of the basics about using Python classes and object-oriented programming. Today we will delve more into classes and see how they make programming life better.</p><h3>Inheritance</h3><p>First off, classes allow you to modify a program without really making changes to it. To elaborate, by subclassing a class, you can change the behavior of the program by simply adding new components to it rather than rewriting the existing components.</p><p>As weâve seen, an instance of a class inherits the attributes of that class. However, classes can also inherit attributes from other classes. Hence, a subclass inherits from a superclass allowing you to make a generic superclass that is specialized via subclasses. The subclasses can override the logic in a superclass, allowing you to change the behavior of your classes without changing the superclass at all.</p><p>Letâs make a simple example. First make a class:</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code">>>>class FirstClass: #define the superclass 126⦠def setdata(self, value): #define methods 127⦠self.data = value #âselfâ refers to an instance 128⦠def display(self): 129⦠print self.data 130â¦</pre></div></span><p>Then we make a subclass:</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code">>>>class SecondClass(FirstClass): #inherits from FirstClass 131⦠def display(self): #redefines âdisplayâ 132⦠print âCurrent value = â%sââ % self.data 133â¦</pre></div></span><p>As you can see, SecondClass âoverwritesâ the display method. When a FirstClass instance is created, all of its actions will be taken from the methods defined in FirstClass. When a SecondClass instance is created, it will use the inherited setdata method from FirstClass but the display method will be the one from SecondClass. </p><p>To make this easier to understand, here are some examples in practice.</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code">>>>x=FirstClass() #instance of FirstClass 134>>>y=SecondClass() #instance of SecondClass 135>>>x.setdata(âThe boy called Brian.â) 136>>>y.setdata(42) 137>>>x.display() 138The boy called Brian. 139>>>y.display() 140Current value = â42â</pre></div></span><p>Both instances (x and y) use the same setdata method from FirstClass; x uses it because itâs an instance of FirstClass while y uses it because SecondClass inherits setdata from FirstClass. However, when the display method is called, x uses the definition from FirstClass but y uses the definition from SecondClass, where display is overridden.</p><div class="ail">
141<script type="text/javascript"><!-- 142google_ad_client = "pub-0901699233733590"; 143google_alternate_ad_url = ""; 144google_ad_width = 300; 145google_ad_height = 250; 146google_ad_format = "300x250_as"; 147google_ad_type = "text_image"; 148google_ad_channel ="3396592814"; 149google_color_border = "FFFFFF"; 150google_color_bg = "FFFFFF"; 151google_color_link = "0000FF"; 152google_color_text = "000000"; 153google_color_url = "000000"; 154//--></script>
vendor: 2 bytes, line 154
154
155<script type="text/javascript" 156 src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 157</script>
157 158</div><p>Because changes to program logic can be made via subclasses, the use of classes generally supports code reuse and extension better than traditional functions do. Functions have to be rewritten to change how they work whereas classes can just be subclassed to redefine methods.</p><p>On a final note, you can use multiple inheritance (adding more than one superclass within the parenthesis) if you need a class that belongs to different groups. In theory this is good because it should cut down on extra work. For example, a person could be a chef, a musician, a store owner, and a programmer; the person could inherit the properties from all of those roles. But in reality it can be a real pain to manage the multiple inheritance sets. You have to ask yourself, âIs it really necessary that this class inherit from all of these others?â; more often than not the answer is, âNoâ. </p><p>Using multiple inheritance is considered an âadvanced techniqueâ and therefore I wonât discuss it. Actually, I donât use it; if I encounter a situation where I could use it, I will try and rethink the programâs structure to avoid using it. Itâs kind of like normalizing databases; you keep breaking it down until itâs as simple as you can get it. If you still need multiple inheritance, then I recommend getting a book </p><h3>Operator Overloads</h3><p>Operator overloading simply means that objects that you create from classes can respond to actions (operations) that are already defined within Python, such as addition, slicing, printing, etc. Even though these actions can be implemented via class methods, using overloading ties the behavior closer to Pythonâs object model and the object interfaces are more consistent to Pythonâs built-in objects, hence overloading is easier to learn and use.</p><p>User-made classes can override nearly all of Pythonâs built-in operation methods. These methods are identified by having two underlines before and after the method name, like this: __add__. These methods are automatically called when Python evaluates operators; if a user class overloads the __add__ method, then when an expression has â+â in it, the userâs method will be used instead of Pythonâs built-in method.</p><p>Using an example from Learning Python, here is how operator overloading would work in practice:</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code" style="height:307px;">>>>class ThirdClass(SecondClass): #is-a SecondClass 159⦠def __init__(self, value): #on âThirdClass(value)â 160⦠self.data = value 161⦠def __add__(self, other): # on âself + otherâ 162⦠return ThirdClass(self.data + other) 163⦠def __mul__(self, other): #on âself * otherâ 164⦠self.data = self.data * other 165⦠166>>>a = ThirdClass(âabcâ) #new __init__ called 167>>>a.display() #inherited method 168Current value = âabcâ 169>>>b = a + âxyzâ #new __add__ called: makes a new instance 170>>>b.display() 171Current value = âabcxyzâ 172>>>a*3 #new __mul__ called: changes instance in-place 173>>>a.display() 174Current value = âabcabcabcâ</pre></div></span><p>ThirdClass is technically a subclass of SecondClass but it doesnât override any of SecondClassâ methods. If you wanted, you could put the methods from ThirdClass in SecondClass and go from there. However, creating a new subclass allows you flexibility in your program.</p><p>When a new instance of ThirdClass is made, the __init__ method takes the instance-creation argument and assigns it to self.data.ThirdClass also overrides the â+â and â*â operators; when one of these is encountered in an expression, the instance object on the left of the operator is passed to the self argument and the object on the right is passed to other. These methods are different from the normal way Python deals with â+â and â*â but they only apply to instances of ThirdClass. Instances of other classes still use the built-in Python methods.</p><p>One final thing to mention about operator overloading is that you can make your custom methods do whatever you want. However, common practice is to follow the structure of the built-in methods. That is, if a built-in method creates a new object when called, your overriding method should too. This reduces confusion when other people are using your co
174de. Regarding the example above, the built-in method for resolving â*â expressions creates a new object (just like how the â+â method does), therefore the overriding method we created should probably create a new object too, rather than changing the value in place as it currently does. Youâre not obligated to âfollow the rulesâ but it does make life easier when things work as expected.</p><h2>Class Methods</h2><p>Instance methods (which is what weâve been using so far) and class methods are the two ways to call Python methods. As a matter of fact, instance methods are automatically converted into class methods by Python.</p><p>Hereâs what Iâm talking about. Say you have a class:</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code">class PrintClass: 175 def printMethod(self, input): 176 print input 177</pre></div></span><p>Now weâll call the classâ method using the normal instance method and the ânewâ class method:</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code">>>>x = PrintClass() 178>>>x.printMethod(âTry spam!â) #instance method 179Try spam! 180>>>PrintClass.printMethod(x, âBuy more spam!â) #class method 181Buy more spam!</pre></div></span><p>So, what is the benefit of using class methods? Well, when using inheritance you can extend, rather than replace, inherited behavior by calling a method via the class rather than the instance.</p><p>Hereâs a generic example:</p><span name="KonaFilter"><div class="code"><p>Generic Code Example:</p><pre class="code" style="height:307px;">>>>class Super: 182⦠def method(self): 183⦠print ânow in Super.methodâ 184⦠185>>>class Subclass(Super): 186⦠def method(self): #override method 187⦠print âstarting Subclass.methodâ #new actions 188⦠Super.method(self) #default action 189⦠print âending Subclass.methodâ 190⦠191>>>x = Super() #make a Super instance 192>>>x.method() #run Super.method 193now in Super.method 194>>>x = Subclass() #make a Subclass instance 195>>>x.method() #run Subclass.method which calls Super.method 196starting Subclass.method 197now in Super.method 198ending Subclass.method</pre></div></span><p>Using class methods this way, you can have a subclass extend the default method actions by having specialized subclass actions yet still call the original default behavior via the superclass. Personally, I havenât used this yet but it is nice to know that itâs available if needed.</p><h2>Have you seen my class?</h2><p>There is more to classes than I have covered here but I think Iâve covered most of the basics. Hopefully you have enough knowledge to use them; the more you work with them the easier they are to figure out. I may have mentioned it before, but it took me almost six months to get my head around using classes. Objects were a new area for me and I couldnât figure out how everything worked. It didnât help that my first exposure to them was Java and C++; my two textbooks just jumped right into using objects and classes without explaining the how's and why's of them. I hope I did better explaining them than my text books did.</p><p>There are several âgotchasâ when using classes, such as learning the difference between âis-aâ and âhas-aâ relationships, but most of them are pretty obvious, especially when you get error messages. If you really get stumped, donât be afraid to ask questions. Remember, we were all beginners once and so many of us have encountered the same problem before.</p></div> 199 <div id="multiparts"><fieldset><legend align="top">Related</legend><ul><li><a href="http://www.gidnetwork.com/b-26.html">Beginning Python Tutorial (Part 1)</a></li><li><a href="http://www.gidnetwork.com/b-27.html">Beginning Python Tutorial (Part 2)</a></li><li><a href="http://www.gidnetwork.com/b-40.html">Beginning Python Tutorial (Part 3)</a></li><li><a href="http://www.gidnetwork.com/b-55.html">Beginning Python Tutorial (Part 4)</a></li><li><a href="http://www.gidnetwork.com/b-67.html">Beginning Python Tutorial (Part 5)</a></li><li><a href="http://www.gidnetwork.com/b-68.html">Beginning Python Tutorial (Part 6)</a></li><li><a href="http://www.gidnetwork.com/b-69.html">Beginning Python Tutorial (Part 7)</a></li><li><a href="http://www.gidnetwork.com/b-74.html">Beginning Python Tutorial (Part 8)</a></li><li><a href="http://www.gidnetwork.com/b-87.html">Beginning Python Tutorial (Part 9)</a></li><li><a href="http://www.gidnetwork.com/b-128.html">Beginning Python Tutorial (Part 10)</a></li><li><a href="http://www.gidnetwork.com/b-133.html">Beginning Python Tutorial (Part 11)</a></li></ul></fieldset></div> 200 <table id="mcomment" cellspacing="0" cellpadding="0" border="0" summary=""> 201 <tr> 202 <td id="tdComment"> 203 <a href="http://www.gidforums.com/t-15073.html">Would you like to comment?</a> <span>This story has been viewed 86,674 times.</span> 204 </td> 205 <td rowspan="2" id="tdAdLink12090"> 206
207<script type="text/javascript"><!-- 208google_ad_client = "pub-0901699233733590"; 209google_alternate_ad_url = ""; 210google_ad_width = 120; 211google_ad_height = 90; 212google_ad_format = "120x90_0ads_al"; 213google_ad_channel = "3396592814"; 214google_color_border = "F5F5F5"; 215google_color_bg = "F5F5F5"; 216google_color_link = "0000FF"; 217google_color_text = "000000"; 218google_color_url = "000000"; 219//--></script>
vendor: 2 bytes, line 219
219
220<script type="text/javascript" 221 src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 222</script>
222 223 224 </td> 225 </tr> 226 <tr> 227 <td id="tdAdFull"> 228
229<script type="text/javascript"><!-- 230google_ad_client = "pub-0901699233733590"; 231google_alternate_ad_url = "http://www.gidnetwork.com/gidcontext-miva.php?format=468x60&gid_affid=48677&color_ba=ffffff&color_bo=ffffff&color_ab=000000&color_li=0000FF&color_te=000000&color_ur=000000&q=computer+programming"; 232google_ad_width = 468; 233google_ad_height = 60; 234google_ad_format = "468x60_as"; 235google_ad_type = "text_image"; 236google_ad_channel ="3396592814"; 237google_color_border = "F5F5F5"; 238google_color_bg = "FFFFFF"; 239google_color_link = "0000FF"; 240google_color_url = "000000"; 241google_color_text = "000000"; 242//--></script>
vendor: 2 bytes, line 242
242
243<script type="text/javascript" 244 src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 245</script>
245 246 247 </td> 248 </tr> 249 </table> 250 </td> 251 <td id="mmenu"> 252 <div>GIDNetwork Sites 253 <ul> 254 <li><a href='//www.gidapp.com'>GIDApp</a></li> 255 <li><a href='//www.gidblog.com'>GIDBlog</a></li> 256 <li><a href='//www.gidforums.com'>GIDForums</a></li> 257 <li><a href='//www.desilva.biz'>Learning Journal by J de Silva, The</a></li> 258 </ul> 259</div> 260 261 <div>Archives 262 <ul><li>List Unavailable</li></ul> 263 </div> 264 265 <div>Recent GIDBlog Posts 266 <ul class='latest'> 267 <li><a href='http://www.gidblog.com/track-your-favourite-4d-number-on-gidapp/'>Track Your Favourite 4D Number on GIDApp</a></li> <li><a href='http://www.gidblog.com/yii-user-extension-includeusermodule-php-failed-to-open-stream-error/'>yii-user Extension “include(UserModule.php): failed to open stream” Error</a></li> <li><a href='http://www.gidblog.com/manage-wordpress-permalink-structure-changes/'>How to change your WordPress Permalink Structure</a></li> <li><a href='http://www.gidblog.com/popular-sharing-buttons-for-gidblog-com/'>Popular Sharing Buttons for GIDBlog.com</a></li> <li><a href='http://www.gidblog.com/gidapp-homepage-redesign/'>GIDApp Homepage Redesign</a></li> <li><a href='http://www.gidblog.com/yii-error-alias-user-usermodule-is-invalid/'>Yii Exception: Alias “user.UserModule” is invalid</a></li> <li><a href='http://www.gidblog.com/redirect-all-subdomains-to-www/'>Redirect all subdomains to www</a></li> <li><a href='http://www.gidblog.com/cannot-login-to-ubuntu/'>Cannot Login to Ubuntu</a></li> <li><a href='http://www.gidblog.com/class-httpresponse-not-found/'>Class ‘HttpResponse’ Not Found</a></li> <li><a href='http://www.gidblog.com/invalid-command-rewritelog/'>Invalid command ‘RewriteLog’</a></li> 268 </ul> 269</div> 270 271 <div>Recent GIDForums Posts 272 <ul class='latest'> 273 <li><a href='http://www.gidforums.com/t-46418.html'>online manual pinless receiver</a></li> <li><a href='http://www.gidforums.com/t-46417.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46416.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46415.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46414.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46413.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46412.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,</a></li> <li><a href='http://www.gidforums.com/t-46411.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46410.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> <li><a href='http://www.gidforums.com/t-46409.html'>Sell Cvv/Transfer WU/Bank/acc paypal Logins/Track 1&2/Dumps,PIN/All..Country</a></li> 274 </ul> 275</div> 276 277 <div>Contact Us 278 <ul> 279 <li><a href="http://www.desilva.biz/feedback.php">Online Form</a></li> 280 </ul> 281 </div> 282 </td> 283 </tr> 284 </table> 285 <table class="np"> 286 <tr> 287 <td class="npl"><span class="larger bolder">«</span> <a href="/b-136.html" title="View PREVIOUS blog">Optimising GIDForums for Search Engines</a></td> 288 <td class="npr"><a href="/b-138.html" title="View NEXT blog">JSP Power Debugger</a> <span class="larger bolder">»</span></td> 289 </tr> 290 </table> 291 <p class="smaller center bolder"><a href='#'>__top__</a></p> 292<div class="smaller center"> 293 <p>Copyright © <a href=http://www.gidnetwork.com/ target=#>GIDNetwork™</a> 2001 - 2026</p> 294 <p>Another website by <em>J de Silva</em></p> 295 <p>Page generated in : 0.00580 sec.</p> 296 297</div> 298</div> 299<!-- Kontera ContentLink -->
300<script type="text/javascript"> 301var dc_UnitID=14; 302var dc_PublisherID=25325; 303var dc_AdLinkColor='#0000FF'; 304var dc_adprod='ADL'; 305</script>
vendor: 2 bytes, line 305
305
306<script type="text/javascript" src="http://kona.kontera.com/javascript/lib/KonaLibInline.js"></script>
306 307<!-- Kontera ContentLink --> 308 309 310<!-- Piwik --> 311<noscript><p><img src="https://pwk.gidnetwork.com/piwik.php?idsite=3" style="border:0;" alt="" /></p></noscript> 312<!-- /Piwik --> 313 314</body> 315</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.