python基础四 面向对象的python

面向对象的python

一.类的定义

class ClassName:
[statement1]
.
.
.
[statementN]

定义一个类Person,grade为类变量,name为实例变量,getName为方法。

	 class People:
  grade = "五年级"
 
  def getName(self):
  self.name = "lihua"
   print(self.name)

通过实例化,可以创建类的实例,即对象

类变量实例变量统称为数据成员,也可以称为属性
类中的函数与普通函数不同,必须有第一个参数。该参数叫什么都无所谓,一般我们命名为self。

对象包括数据成员方法

若要将属性或方法声明为私有,只需在属性或方法前加双下划线__
私有类变量:__grade
私有实例变量:__self.name
私有方法:def __method(self):pass

区分类中的三种变量:
1.类变量:在类中且函数(方法)之外定义的变量,与实例变量区分开。
各个实例共享类变量。一个对象修改了类变量,那么其他对象的类变量也会改变。
2.局部变量:在函数(方法)中定义的变量。
3.实例变量:类的函数中用【self.变量名】定义的变量。即self后跟的都是实例变量,而不是类变量。
各个实例(对象)的实例变量不会共享。
可以使用【对象名.dict】打印出该对象的所有实例变量。

类变量在类创建后就存在了。下面我们看一下实例变量何时会被创建:

>>> class Y :
...  def  f(self):
...    self.num = 1
...
>>> y = Y()
>>> y.__dict__
{}
>>> y.f()
>>> y.__dict__
{'num': 1}

很显然,代码中定义了实例变量num,它是在执行了self.num = 1 后才被创建的。
所以严格来说,实例变量是对象的,而不是类的。

二.类的对象

1.定义People类,可以实例化出一个对象people

people = People()

2.通过对象访问类的属性和方法

people.name = "zhangming"
people.getName()

#执行结果
'''
zhangming
'''

三.类的构造方法

类有一个构造方法名为 init(),当类实例化时就会自动调用此方法。

重新定义类People,该类仅有构造方法

class People:
  def __init__(self,name):
   self.name = name

实例化类People

people = People("lili")
print(people.name)
#输出结果
'''
lili
'''

可以看到,类在实例化时有了参数name。另外注意,init()还为People类定义了一个变量name。

四.函数的第一个参数

类中的函数与普通函数不同,必须有第一个参数。该参数叫什么都无所谓,一般我们命名为self。当然,你也可以命名为x,flower等。
现在规定第一个参数为self。self代表的是类的实例,而不是类本身。

对于上一小节代码中的self.name,name为实例变量
即使类中已经定义了类变量name,它也是实例变量,也就是说,这两个变量name是不同的。
想要使用类变量,需要使用【类名.变量名】的语法

看一个例子:

>>> class example:
...  num = 1
...  def plus(self):
...   self.num = self.num+1

上边定义了一个类,它既有类变量num,也有实例变量num。
第四行中的num为实例变量。但由于它没有初始值,所以它会借用类变量num的值进行+1操作。

>>> ex = example()
>>> ex.plus()
>>> ex.num
2
>>> example.num
1

这几行代码说明了实例变量和类变量纠缠不清的关系:
第三行语句ex.num中,num为实例变量。由于实例变量num没有初始值,它会借用类变量num的值进行+1操作。
第四行语句example.num中,num为类变量。类变量num只是把值复制了一份给实例变量,它自己的值并没有改变。

总结:【对象.变量】语句中,默认使用实例变量的值,若无实例变量则使用类变量的值。
实例变量自己没有初始值但要进行运算时,会借用类变量的值,但类变量本身并没有改变。

五.继承

子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
派生类定义如下:

class DerivedClassName(BaseClassName):
statement-1
.
.
.
statement-N

5.1多继承

多继承的格式如下

class DerivedClassName(Base1, Base2, Base3):
statement-1
.
.
.
statement-N

5.2方法重写

定义基类Base和子类Child
在子类中重写方法method(self)
最后使用super方法通过子类调用基类方法

>>> class Base:
...  def method(self):
...   print("我是基类")
...
>>> class Child(Base):
...  def method(self):
...   print("我是子类")
...
>>> c = Child()
>>> c.method()
我是子类
>>> super(Child,c).method()
我是基类

super方法还可以这样使用

>>> class Child(Base):
...  def method(self):
...    super().method()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值