类和对象

1、定义类
定义类的语法:

class 类名 [(父类)]:
      类体
2、构造方法
__init__()      #定义__init__()方法时,它的第一个参数应该是self,之后的参数用来初始化实例变量。调用构造方法时不需要传入self参数
示例代码:

class Dog:
    def __init__(self, name, age, sex='雌性'):               #构造方法
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return f'{self.name}, {self.age}岁, {self.sex}'

d1 = Dog('球球', 2)                                          #创建对象并调用构造方法
d2 = Dog('贝贝', 3, '雄性')
d3 = Dog(name='黑子', sex='雄性', age='4')

print(d1)
print(d2)
print(d3)
3、实例变量
示例代码:

class Dog:
    def __init__(self, name, age, sex='雌性'):
        self.name = name                           #初始化实例变量name
        self.age = age                             #初始化实例变量age
        self.sex = sex                             #初始化实例变量sex
4、实例方法
示例代码:

class Dog:
    def __init__(self, name, age, sex='雌性'):
        self.name = name
        self.age = age
        self.sex = sex
    def run(self):                                  #定义实例方法,只有一个self参数
        print("{}在跑".format(self.name))
    def speak(self, sound):                         #定义实例方法,第1个参数是self,第2个参数是sound
        print("{}在叫".format(self.name, sound))

d1 = Dog('贝贝', 2)                                  #创建对象并调用构造方法
d1.run()                                            #调用时采用“对象.实例方法”形式,不需要传递参数
d1.speak('旺、旺、旺')                               #传递第一个参数sound
5、类变量
类变量是属于类的变量,不属于单个对象

实例代码:

class Account:
      interest_rate = 0.43                         #定义类变量
      
      def __init__(self, ower, amount):
          self.ower = ower
           self.amount = amount
account = Account('Tony', 6666)

print("账户名:{0}".format(account.ower))             #对实例变量,通过“对象.实例变量”形式访问
print("金额:{0}".format(account.amount))             #对实例变量,通过“对象.实例变量”形式访问
print("利率:{0}".format(Account.interest_rate))      #对类变量,通过“类名.类变量”形式访问 
6、类方法
类方法和类变量相似,都属于类,不属于个体实例。定义类方法时,它的第一个参数不是self,而是类本身。

示例代码:

class Account:
      interest_rate = 0.43
      def __init__(self, owner, amount):
          self.owner = owner
          self.amount = amount
      
      @classmethod
      def interest_by(cls, amt):               #cls代表类自身
          return cls.interest_rate * amt

interest = Account.interest_by(10000)          #对类方法可以通过“类名.类方法”形式访问
print("计算的利息:{}".format(interest))
7、私有变量
变量前加上双下划线(__)即可

示例代码:

class Account:
    __interest_rate = 0.48                 #定义私有类变量
    
    def __init__(self, owner, amount):
        self.owner = owner
        self.__amount = amount            #初始化私有实例变量

   
account = Account('Tony', 6666)

print("账户名:{0}".format(account.owner))
print("账户金额:{0}".format(account.__amount))        #报错。原因:不可以访问私有变量
print("利率:{0}".format(account.__interest_rate))    #报错。原因:不可以访问私有变量
8、私有方法
私有方法和私有变量的封装是一样的,在方法前加上双下划线(__)就是私有方法了。

示例代码:

class Account:
    __interest_rate = 0.48                 #定义私有变量
   
    def __init__(self, owner, amount):
        self.owner = owner                 #初始化实例变量
        self.__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', 6666)
account.__get_info()                        #报错,原因:类的外部不能调用私有方法
account.desc()
9、使用属性
class Dog:
   def __init__(self, name, age, sex='雌性'):
       self.name = name
       self.__age = age                        #初始化私有化实例变量
  
   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()))

-----------------------------------------------------------

class Dog:
    def __init__(self, name, age, sex='雌性'):
        self.name = name
        self.__age = age

    def run(self):
        print("{}再跑...".format(self.name))
    
    @property
    def age(self):                                 #替代get_age(self):
        return self.__age
    
    @age.setter
    def age(self, age):                            #替代set_age(self, age)
        self.__age = age

dog = Dog('球球', 2)
print('狗狗的年龄:{}'.format(dog.age))             #通过属性取值,访问形式为“对象.属性”
dog.age = 3                                         #通过属性赋值,访问形式为“对象.属性”  
print('修改后的狗狗年龄:{}'.format(dog.age))
10、继承性
声明子类继承父类,语法很简单,定义类时在类的后面使用一对小括号指定它的父类就可以了。不过,只能继承公有的成员变量和方法。

示例代码:

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

    def show_info(self):
        return "动物的名称:{0},年龄:{1}".format(self.name, self.age)

class Cat(Animal):
    def __init__(self, name, age):
        super().__init__(name)                        #调用父类的构造方法,初始化父类的成员变量
        self.age = age                                #初始化子类的实例成员变量age
cat = Cat('Tom', 3)                                   #创建对象并调用构造方法
print(cat.show_info())
11、多继承
当子类继承多个父类时,如果在多个父类中有相同的成员方法或成员变量时,则子类优先继承左边父类的成员方法或成员变量,从左到右继承级别从高到底

实例代码:

class Horse:
    def __init__(self,name):
        self.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                              #初始化子类的实例成员变量age

m = Mule('骡宝莉', 1)
m.run()                                             #继承父类的Horse()方法
m.roll()                                            #继承父类的Donkey()方法
print(m.show_info())                                #继承父类的Horse()方法
12、重写方法
如果子类的方法名和父类的方法名相同,则在这种情况下,子类的方法会重写(override)父类的同名方法

实例代码:

class Horse:
    def __init__(self,name):
        self.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                              #初始化子类的实例成员变量age
    def show_info(self):                            #重写父类的show_info()方法
        return "骡的名字:{0},年龄:{1}".format(self.name, self.age)

m = Mule('骡宝莉', 1)
m.run()                                             #继承父类的Horse()方法
m.roll()                                            #继承父类的Donkey()方法
print(m.show_info())                                
13、继承与多态
在多个子类继承父类并重写父类的方法后,这些子类所创建的对象之间就是多态的。这些对象采用不用的方式实现父类的方法

示例代码:

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()
14、鸭子类型测试与多态
鸭子类型测试指:若看到一只鸟走起来像鸭子,游起来像鸭子,叫起来也像鸭子,那么这只鸟可以被称为鸭子
python解释器不检查发生多态的对象是否继承了同一个父类,只要它们有相同的行为(方法)。它们之间就是多态的

示例代码:

def start(obj):                                  #接收的obj对象具有的speak()方法
    obj.speak()

class Animal():
    def speak(self):
        print('动物叫,但不知道是那种动物叫')
class Dog(Animal):
    def speak(self):
        print('小狗:汪汪汪...')
class Cat(Animal):
    def speak(self):
        print('小猫:喵喵喵...')
class Car:
    def speak(self):
        print('小车:嘀嘀嘀...')

start(Dog())
start(Cat())
start(Car())

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注