python_类与对象

1.

python_类与对象_第1张图片

 

 

 

2.实例变量就是对象个体特有的数据,例如狗狗的名称和年龄等。

3.构造方法:--init--()方法是构造方法,构造方法用来初始化实例变量。

#coding=utf-8
class Dog:
def __init__(self,name,age):#构造方法
self.name=name #创建和初始化实例变量name
self.age=age #创建和初始化实例变量age
d=Dog('球球',2) #创建对象
print('我家狗狗名字叫{0},{1}岁了'.format(d.name,d.age))

4.构造方法

class Dog:
def __init__(self,name,age,sex='雌性'):
self.name=name #创建和初始化实例变量name
self.age=age # 创建和初始化实例变量age
self.sex=sex #创建和初始化实例变量sex
d1=Dog('球球',2) #创建对象调用构造方法,省略默认值
d2=Dog('哈哈',1,'雄性')
d3=Dog(name='拖布',sex='雄性',age=3) #使用关键字参数调用构造方法
print('{0}:{1}岁{2}'.format(d1.name,d1.age,d1.sex))
print('{0}:{1}岁{2}'.format(d2.name,d2.age,d2.sex))
print('{0}:{1}岁{2}'.format(d3.name,d3.age,d3.sex))

5.实例方法
实例方法和实例变量一样,都是某个实例(或对象)个体特有的方法。
class Dog:
#构造方法
def __init__(self,name,age,sex='雌性'):
self.name=name #创建和初始化实例变量name
self.age=age #创建和初始化实例变量age
self.sex=sex #创建和初始化实例变量sex
#实例方法
def run(self): #定义实例方法,只有一个self参数
print("{}在跑。。".format(self.name))
#实例方法
def speak(self,sound): #定义实例方法 ,第一个参数时self,第二个参数是sound
print('{}在叫,"{}"!'.format(self.name,sound))

dog=Dog('球球',2) #创建对象调用构造方法,省略默认值
dog.run() #在调用时采用“对象.实例方法”形式,不需要传递参数
dog.speak('旺 旺 旺') #需要传递一个参数sound
6.类变量:属于类的变量,不属于单个对象
举例:1)Account(银行账户)类:有三个成员变量:amount(账户金额),interset_rate(利率),owner(账户名).
amount,owner对于每一账户都是不同的-实例变量
interest_rate对于所有账户都是相同的,-所有账户实例共享的变量,属于类,类变量

class Account:
interest_rate=0.0568 #类变量
def __init__(self,owner,amount):
self.owner=owner #创建并初始化实例变量owner
self.amount=amount #创建并初始化实例变量amount
account=Account("Tony",80000)
print('账户名:{0}'.format(account.owner))
print('账户金额:{0}'.format(account.amount))
print('利率:{0}'.format(Account.interest_rate)) #对类变量通过‘类名.类变量’形式访问

7.类方法
#coding=utf-8
class Account:
interest_rate=0.0668 #类变量

def __init__(self,owner,amount):
self.owner=owner #定义实例变量
self.amount=amount#定义实例变量
#类方法
@classmethod #定义类方法需要的装饰器
def interest_by(cls,amt): #cls代表类本身,即account类
return cls.interest_rate*amt
interest=Account.interest_by(12000)
print('计算利息:{0}'.format(interest))

8.封装性
私有变量:—— ——XX

#coding=utf-8
class Account:
__interest_rate=0.0568 #私有类变量
def __init__(self,owner,amount):
self.owner=owner #创建并初始化公有实例变量owner
self.__amount=amount #创建并初始化私有实例变量__amount
def desc(self):#在类的内部可以访问私有变量
print("{0}金额:{1}利率:{2}".format(self.owner,self.__amount,Account.__interest_rate))

account=Account('Tony',8000)
account.desc()
print("账户名:{0}".format(account.owner))
print('账户金额:{0}'.format(account.__amount))#报错,在类的外部不可以访问私有变量
print('利率:{0}'.format(Account.__interest_rate))#报错,在类的外部不可以访问私有变量
私有方法
class Account:
__interest_rate=0.0568 #私有类变量
def __init__(self,owner,amount):
self.owner=owner #创建并初始化公有实例变量owner
self.__amount=amount #创建并初始化私有实例变量__amount
def __get_info(self):#定义私有方法
return "{0}金额:{1}利率:{2}".format(self.owner, self.__amount, Account.__interest_rate)
def desc(self):
print(self.__get_info())#在类的内部可以调用私有方法

account=Account('Tony',8000)
account.desc()
account.__get_info#报错 在类外部不可以调用私有方法
9.使用属性
为了实现对象的封装,在一个类中不应该有公有的成员变量,这些成员变量应该被设计成私有的,然后通过公有的set和get方法访问
class Dog:
#构造方
def __init__(self,name,age,sex='雌性'):
self.name=name #创建和初始化实例变量name
self.__age=age #创建和初始化私有实例变量__age

def run(self):
print("{}在跑".format(self.name))
#get方法
def get_age(self):#定义get()方法,返回私有实例变量__age
return self.__age
def set_age(self,age):#定义set()方法,通过age参数更新私有实例变量__age
self.__age=age

dog=Dog('球球',2)
print('狗狗年龄:{}'.format(dog.get_age()))
dog.set_age(3)
print('修改后狗狗年龄:{}'.format(dog.get_age()))
10.上面例子,外部调用者通过2个公有方法访问被封装的私有成员变量,比较麻烦,可以在类中定义属性,属性可以替代get()和set()两个公有方法。
class Dog:
#构造方法
def __init__(self,name,age,sex='雌性'):
self.name=name #创建和初始化实例变量name
self.__age=age #创建和初始化私有实例变量__age
#实例方法
def run(self):
print("{}在跑。。。".format(self.name))
@property
def age(self):#替代get_age(self),定义age属性的get()方法,使用@property装饰器进行修饰,方法名就是属性名,即age
return self.__age
@age.setter
def age(self,age):#替代set_age(self,age),定义age属性的set()方法,使用@age.setter装饰器进行修饰,age是属性名
self.__age=age
dog=Dog('球球',2)
print('狗狗年龄:{}'.format(dog.age))
dog.age=3
print('狗狗年龄:{}'.format(dog.age))
11.继承

class Animal:
def __init__(self,name):
self.name=name #初始化父类的实例成员变量name
def show_info(self):
return "动物的名字:{0}".format(self.name)
def move(self):
print("动一动。。")
class Cat(Animal):
def __init__(self,name,age):
super().__init__(name) #调用父类构造方法,初始化父类成员变量
self.age=age #实例变量age
cat=Cat('Tom',2)#创建cat对象时调用Cat类构造方法
cat.move()
print(cat.show_info())

12.多继承:如果在多个父类中有相同的成员方法或成员变量,则子类优先继承左边父类的成员方法或者成员变量
#多继承
class Horse:
def __init__(self,name):
self.name=name #实例变量name

def show_info(self):
return "马的名字:{0}".format(self.name)
def run(self):
print("马跑。。。")
class Donkey:
def __init__(self,name):
self.name=name
def show_info(self):
return "驴的名字:{0} ".format(self.name)
def run(self):
print("驴跑。。。")
def roll(self):
print("驴打滚...")

class Mule(Horse,Donkey):
def __init__(self,name,age):
super().__init__(name)
self.age=age #实例变量

m=Mule('骡宝利',1)
m.run() #继承父类Horse方法
m.roll() #继承父类Donkey方法
print(m.show_info())#继承父类Horse方法
13.方法重写
如果子类的方法名和父类的方法名相同,则子类的方法会重写override父类的同名方法
#重写
class Horse:
def __init__(self,name):
self.name=name #实例变量name

def show_info(self):
return "马的名字:{0}".format(self.name)
def run(self):
print("马跑。。。")
class Donkey:
def __init__(self,name):
self.name=name
def show_info(self):
return "驴的名字:{0} ".format(self.name)
def run(self):
print("驴跑。。。")
def roll(self):
print("驴打滚...")

class Mule(Horse,Donkey):
def __init__(self,name,age):
super().__init__(name)
self.age=age #实例变量
def show_info(self):
return "骡子:{0},{1}岁".format(self.name,self.age)

m=Mule('骡宝利',1)
m.run() #继承父类Horse方法
m.roll() #继承父类Donkey方法
print(m.show_info())#子类Mule自己的方法,不继承父类Horse方法

14.继承与多态
在多个子类继承父类,并重写父类方法后,这些子类所创建的对象之间就是多态的。这些对象采用不同的方式实现父类方法
#多态
class Animal:
def speak(self):
print('动物叫,但不知道是哪种动物叫!')
class Dog(Animal):
def speak(self):
print('小狗:汪汪')
class Cat(Animal):
def speak(self):
print('小猫:喵喵')
an1=Dog()
an2=Cat()
an1.speak()
an2.speak()
15.

你可能感兴趣的:(python_类与对象)