'''
python中的类
1、类(class):用来描述具有相同的属性和方法的集合。它定义了该集合中每一个对象多共有的属性和方法。对象是类的实体
2、变量称为属性
3、方法称为行为
4、对象是类的实例。在教室里面的每个同学都是人类这个类的一个具体的对象,然后对象又称为实例【实际存在的例子】
5、实例化:根据一个类创建不同的对象的过程叫做实例化
6、方法:就是类里面定义的函数
7、类变量:人类所共有的属性 head = 1
8、实例变量:对象或者实例所独有的
9、类是用class 来定义,类名称首字母要大写
class People(object): #新式类
class People: 经典类
10、类里面定义一个方法需要空一个tab键
'''
class People(object): #object称为父类、基类、也会是一切类的父类
head=1 #这就是类变量
# 这是构造函数,也称构造方法,作用是为了创建对象用的
# 双下划线表示为私有的方法
def __init__(self,name,age): #这个name就是性格是参数
self.name=name #self,name称为实例变量,实例变量是实例独有的,self是当前类的对象本身
self,__age=age
# 这是一个实例方法
def play(self):
print(self.name+'去打篮球')
#类方法
#这个@符号称为装饰器,作用是为了不影响原有方法,在原有方法的功能基础之上增加新的功能
#cls就是代表的是class的缩写,特点是类可以直接调用类方法(因为属于类的,不用创建对象)
@classmethod
def func1(cls):
print('这是一个类方法')
#静态方法
@staticmethod
def func2():
print('这是一个静态方法')
#私有方法、只能在类的内部
def __func3(self):
print('这是一个私有方法')
#可以通过穿件一个实例方法来引用私有变量的结果
def func4(self):
return self.__func3()
#通过创建一个实例方法来引用私有变量的结果
def func5(self):
return self.__age
#def func5(self):
# 创建一个对象
#实例化一个对象
p=People('小高') #创建出来一个对象p,这个对象的名字叫做小高
p1=People('小刘') #People()称为匿名对象,因为没有传入实际对象名称
p.play()
p1.play()
#1、类和对象调用类变量、实例变量
print(People.head) #调用实例变量
print(People.name) #报错,类调用实例变量,实例变量是对象和实例独有的
print(p.head) #对象调用类变量
print(p.name) #对象调用实例变量
#2、类和对象调用私有方法和私有变量
People.play(p) #类调用实例方法报错,但是传输一个对象,表示具体哪个对象取打篮球
People.func1() #类调用类方法
People.func2() #类调用静态方法
p.play() #对象调用实例方法
p.func1() #对象调用类方法
p.func2() #对象调用静态方法
#3、类和对象调用私有和私有变量
People.__func3 #报错
p.__func3 #报错
People.func4() #报错,类不能直接调用实例方法
p.func4() #对象调用实例方法
print(p.name) #对象能调用实例方法
print(p.__age) #对象不能调用私有变量
print(p.func5()) #对象调用实例方法引用到的私有变量结果
print(People.func5(p)) #类调用实例方法需要传对象
'''
调用私有方法和私有变量总结:
私有方法和私有变量都不能直接被类和对象所调用,必须先在类的内部通过创建实例方法引用私有变量和私有方法,
并将其结果进行返回给实例方法。然后再再类外部通过类和对象调用实例方法,就可以得到私有变量和私有方法的结果
'''
#python当中,类的三大特性
#1、封装特性
class People(object):
def __init__(self,name):
self.__name = name #双下划线开头的变量叫私有变量,只能在类内部里面使用
def setName(self,newname):
self.__name = newname #设值
def getName(self):
return self.__name #取值
p = People("xiaowang")
# print(p.__name) #报错,对象和类不能直接调用私有变量,也不能直接调用私有方法
p.setName("xiaoxiaoming")
print(p.getName())
#2、继承
class Father (object) :
def __init__(self):#默认构造函数,什么都没有,没有属性
pass
def smoke(self):
print('喜欢抽烟')
def rich_man(self):
print('非常有钱')
def play(self):
print('喜欢打牌')
class Son(Father): #子类继承父类,继承多个父类可以这样写class Son(Father,A,B)
def __init__(self):
Father.__init__(self) #继承父类的构造函数
def car(self):
print('喜欢车')
def basketball(self):
print('喜欢篮球')
def girl(self):
print( '喜欢美女')
def play(self):
print( '喜欢玩儿')
s = Son()
s.rich_man() #调用的时候会联想出父类的特性
s.play ()
s.smoke()
s.girl() #自己的特性也会保留
s.play() #父类和子类有相同特性,只能调用本身的特性
# 多态特性
# 1、多态是以继承和重写父类方法为前提,对所有子类实例化产生的对象调用相同的方法,执行产生不同的执行结果。
# 2、例如同样是人,但是当问起一个人的职业时会有不同的结果,可能是软件测试工程师,可能是HR
# 3、一个对象的属性和行为不是由他所继承的父类决定的,而是由其本身包含的属性和方法决定的。
#3、多态(方法的重写)
class Animal(object):
def talk (self):
print('我是动物')
class Cat (Animal):
def talk (self):
print('瞄瞄')
class Dog( Animal):
def talk (self):
print( '汪汪')
a = Animal()
a.talk()
c = Cat()
c.talk()
d = Dog()
d .talk()
|
|