人生苦短之Python类的一二三

在Python中,类也是以class开头定义的。我们定义一个动物类,它有名字和年龄,在java变量有实例变量和局部变量,方法内的变量是局部变量,类里面的变量是实例变量。那么在Python中的类及其属性这些是如何定义使用的呢?

class Animal():
	pass

类的属性    

我们知道类都是有属性的,在java中一般是在类中就定义了属性,而在python中是可以直接就给实例添加属性的。

>>> a = Animal()>>> a.name = ‘dog‘>>> print a.namedog>>> a<__main__.Animal instance at 0x0000000002C5E708>>>>

但是这个属性仅作用于这个实例变量,当我们再次新建一个实例的时候,就没有这个属性了。

>>> b = Animal()
>>> print b.name

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    print b.name
AttributeError: Animal instance has no attribute ‘name‘
>>>

那么如何创建一个类属性呢?可以在内部直接定义一个变量。

>>> class Student():
	name = ‘Student‘
	pass

>>> a = Student()
>>> print a.name
Student
>>>

实例化对象后可更改这个属性值。

>>> a.name = ‘teacher‘
>>> print a.name
teacher
>>>

 

类的私有属性

        在java中我们知道可以通过private来控制访问限制,可以修饰变量,也可以修饰方法,使之只能在类的内部使用,那么在python中是如何实现的呢?通过在变量前添加‘__’来定义私有变量。

>>> class Student():
	def __init__(self,name):
		self.__name = name

>>> s = Student(‘Bob‘)
>>> s.name

Traceback (most recent call last):
  File "<pyshell#69>", line 1, in <module>
    s.name
AttributeError: Student instance has no attribute ‘name‘
>>> s.__name

Traceback (most recent call last):
  File "<pyshell#70>", line 1, in <module>
    s.__name

既然私有变量无法直接访问到,那么我们如何使用呢?当时是setter,getter方法,在类的内部为私有变量添加setter和getter方法我们就可以访问和修改它们了。这里就不做描述了。

构造方法

          在java中有默认的构造方法,也可以根据我们的需要创建构造方法,实例化对象时根据需要创建符合我们需求的对象。在Python中也是有构造方法的。使用__init__,传入self及需要的变量。

>>> class Animal():
	def __init__(self,name,age):
		self.name = name
		self.age = age

>>> a = Animal()

Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    a = Animal()
TypeError: __init__() takes exactly 3 arguments (1 given)
>>> a = Animal(‘dog‘,23)

值得注意的是,当我们写了类的构造方法的时候,实例化对象的时候必须使用构造方法来实例化对象,否则就会报错误。

类方法

          在类中不光有属性还有方法,类方法就是在类中直接定义方法。

>>> class Animal():
	def __init__(self,name,age):
		self.name = name
		self.age = age
        def printName(self):
		print(self.name)

>>> a = Animal(‘dog‘,22)
>>> a.printName
<bound method Animal.printName of <__main__.Animal instance at 0x0000000002C64488>>
>>> a.printName()
dog
>>>

面向对象的三大特性,封装,继承,多态,封装不用多说了,在很多地方都有体现。我们来看下python中的继承和多态。

>>> class Animal():    def __init__(self,name,age):        self.name = name        self.age = age        def printName(self,sex):        print(self.name,sex)

        >>> a = Animal(‘dog‘,22)>>> a.printName(‘aa‘)(‘dog‘, ‘aa‘)>>> class Dog(Animal):    pass

>>> b = Dog()

Traceback (most recent call last):  File "<pyshell#54>", line 1, in <module>    b = Dog()TypeError: __init__() takes exactly 3 arguments (1 given)\>>> b = Dog(‘2哈‘,12)SyntaxError: invalid syntax>>> b = Dog(‘hashiqi‘,12)>>> b<__main__.Dog instance at 0x0000000002C64848>>>>

我们定义一个Dog类继承于Animal,当我们实例话的时候发现它的构造方法也是继承于父类,需要传入名字和年龄,但是我们想让它拥有自己的构造方法怎么办呢?重写__init__方法。

>>> class Dog(Animal):
	def __init__(self,name,color):
		self.name = name
		self.color = color

>>> b = Dog(‘2ha‘,‘red‘)
>>>

这样就体现了面向对象的继承和多态。

时间: 2024-10-10 03:51:06

人生苦短之Python类的一二三的相关文章

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

第六章 Python类(面向对象编程)

什么是面向对象编程? 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构.Python就是这种编程语言. 面向对象程序设计中的概念主要包括:对象.类.继承.动态绑定.封装.多态性.消息传递.方法. 1)对象:类的实体,比如一个人. 2)类:一个共享相同结构和行为的对象的集合.通俗的讲就是分类,比如人是一类,动物是一类. 3)继承:类之间的关系,比如猫狗是一类,他们都有四条腿,狗继承了这个四条腿,拥有了这个属性. 4)动态绑定:在不

Python类属性访问的魔法方法

Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- 定义当该类的属性被访问时的行为 注意:当__getattr__与__getattribute__同时重写时,访问属性时,优先调用__getattribute__,只有当被访问的属性不存在时才触发__getattr__ 3. __setattr__(self, name, value)- 定义当一个

LightMysql:为方便操作MySQL而封装的Python类

原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python操作MySQL数据库的一个常用包.但在使用过程中,我认为用起来还不够简便.为此,我在mysqldb的基础上封装了一个Python类LightMysql. 先来看如何使用 example.py #!/usr/bin/env python # -*- coding: utf-8 -*- from Lig

python类的继承

Python 类的一些基本概念 Python中一切皆对象,声明变量函数等的过程实际上就是它们到内存中为对象分配的空间的连接.Python中的类同Java.C++一样,有自己的属性与方法.属于一个对象或类的变量被称为域. 域有两种类型--属于每个实例/类的对象或属于类本身,它们分别被称为实例变量和类变量. 类的变量 由一个类的所有对象(实例)共享使用.所有对象共用一个类变量的拷贝.对象的变量 由类的每个对象/实例拥有.因此每个对象有自己对这个域的一份拷贝. 类的方法与普通的函数只有一个特别的区别-

python 类组合

在使用一款云产品的python sdk过程中,发现了python类之间调用的另一种少见方法:类组合,那么类组合是用来干吗的呢? 我们知道,在python中,类之间的相互调用,我们习惯性的采用继承的方法,但是 除了继承方法,我们还可以采用类组合的方式来调用另一个类 官方的说法:让不同的类混合并加入到其他类中,来增强功能和代码重用性.你可以在一个大点的类中创建你自己的类的实例,实现一些其他属性和方法来增强原来的类对象. 举个例子: >>> class Name(object):       

Python类的__getitem__和__setitem__特殊方法

class testsetandget:    kk = {};      def __getitem__(self, key):          return self.kk[key];      def __setitem__(self, key, value):          self.kk[key] = value;a = testsetandget()a['first'] = 1print a['first']a.__setitem__('second', 2)print a._

Python 类特殊方法__getitem__如何使用?

本文和大家分享的主要是python类的特殊方法__getitem__相关内容,一起来看看吧,希望对大家学习python有所帮助. 凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样 p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法__getitem__. 先用一个夸张一点的例子来说明这个问题. 当实例对象通过[] 运算符取值时,会调用它的方法__getitem__,从上面代码中输出二个笑脸可以看出来. 一般这样用 ''' 黄哥Pyth

python 类 六:继承自动寻找父类

本系列博客(python 类) 的部分例子来自于 <<python 核心编程 第二版>> 前面我们谈到 python 继承,是可以引用父类的__init__方法的 ,并在此基础上添加子类自己的特殊的属性的设定,形成子类自己的__init__  构造函数. 在这种方法中,必须显示的指出父类的名字. #coding:utf-8 class p(object):     def __init__(self,nm):         self.name  = nm class c(p):