python的类和对象:
一. 类(class)的定义(属性,方法)
1. python中类名以大写字母开头
2. 属性为各类变量的定义,方法为函数;属性和函数均默认为公有值
a. 公有属性:
class PigWenHao: # python中类名以大写字母开头
color='green'
weight='120'
height='170'
#属性
def Hat(self):
print('his hat is green')
def like(self):
print('his lover is yhr')
def changeColor(self,color):
self.color=color
def getColor(self):
print('this color is :',self.color)
#方法
调用时可以直接:
zwh = PigWenHao() #我们需要用class类创建一个实例对象,下文介绍
print(zwh.color) #对公有属性的直接访问
b. 私有属性:
python name mangling名字改编技术实现私有变量 - - 使用双下划线实现私有变量,函数;
class Person:
__name='zwh'
p=Person()
print(p.name) #尝试访问私有变量
那该怎么访问私有属性呢?
↓
1. 从内部调用私有变量并返回;
class Person:
__name='zwh'
def getName(self):
return self.__name #从内部返回私有变量
p=Person()
print(p.getName())
↓
2. python其实就是通过改名方式隐藏变量,可以通过 _ 类名_ _ 变量名访问私有变量;
print(p._Person__name)
#访问私有变量,采用_类名__变量名(类名前单下划线,变量名前双下划线)
3. 方法括号里的self是什么?python 的self相当于C++的指针;
当一个对象的方法被调用,对象会将自身作为第一个参数传给self参数,其他参数需要用户定义方法时另加;
调用方法时,不需要填写self参数,如果用户有其他的自定义参数,则需要填入。
class Ball:
name='yhr'
def setName(self,name):
self.name=name
def kick(self):
print('i am %s who kick me?'%self.name)
a=Ball()
a.setName('A')
b=Ball()
b.setName('B')
c=Ball()
a.kick()
b.kick()
c.kick()
4. 类的构造方法: _ _ init_ _(self,param1…)
构造方法:只要实例化一个对象,这个方法就会对象被创建的时候自动被调用
class Ball:
def __init__(self,name='default'): #name有默认值,调用时若没有填写name参数,则使用默认值
self.name=name
def kick(self):
print('i am %s who kick me?' % self.name)
a=Ball()
b=Ball('b')
a.kick()
b.kick()
二. 对象的创建(instance)
我们需要用class类创建一个实例instance,称为对象;
创建好的一个实例对象 赋值给一个变量,如果不赋值,则python垃圾回收机制可能会回收掉这个对象。
zwh = PigWenHao()
#创建好的一个实例对象 赋值给zwh
#如果不赋值,则python垃圾回收机制可能会回收掉
zwh.Hat()
zwh.like()
zwh.getColor()
zwh.changeColor('red')
zwh.getColor()
三. 面向对象的特征(object Oriented)
1. 封装
2. 继承
3. 多态
(1) 封装:
封装 封装属性,方法;是一种信息隐蔽技术。
用户不需要了解方法的内部构造,只需调用类的方法即可
类的方法和属性都定义在类内部,被封装。
list1=[2,1,7,5,3]
list1.sort() #例如列表的一些方法操作,只需要调用即可,不需了解具体实现
list1.append(9)
print(list1)
(2) 继承:
继承: 子类自动共享父类之间数据和方法的机制
class list2(list): #例如list2继承一个list父类
pass #pass是一个占位符,表示不做任何事情
listDuixiang = list2()
listDuixiang.append(8)
print(listDuixiang)
(3) 多态:
多态:不同对象对同一方法相应不同的行动
class A:
def fun(self):
print('i am A....')
class B:
def fun(self):
print('i am B....')
a=A()
b=B()
a.fun()
b.fun()
可以看到虽然同样是fun()方法,但是由于fun()分别定义在A,B两个类,所以其实是两个不同的实现过程。