类与对象
定义
class Person:
def __init__(self,name,height):#构造函数
self.name=name#公有属性
self.__age=None#双下划线标识私有属性
self.__height=height
def set_age(self,age):
if not isinstance(age,int) or age<=0:
print('输入年龄必须是大于0的自然数!')
return False
self.__age=age
def print_Person(self):#共有函数
print('姓名',self.name)
print('年龄',self.__age)
print('身高',self.__height)
person1=Person('WYF',176)
person1.set_age(-1)
person1.print_Person()
isinstance函数:如果可实例化对象的类型与参数二的类型相同则返回 True,否则返回 False。
继承和多态
class Animal:
def __init__(self,name):
self.name=name
def say(self):
print('Animal')
def print_Animal(self):
print('名字是:',self.name)
class Dog(Animal):#类继承
def __init__(self):#子类定义构造,不会自动调用父类构造
super(Dog,self).__init__('旺财')
def say(self):
print('Dog')
class Cat(Animal):
def say(self):
print('Cat')
dog=Dog()
dog.print_Animal()
print(isinstance(dog,Dog))#判断实例是不是某个对象,True
print(isinstance(dog,Animal))#True
def animal_say(animal:Animal):#只要参数是Animal或者其子类即可调用
animal.say()
dog=Dog()
cat=Cat()
animal_say(dog)#Dog
animal_say(cat)#Cat
super() 函数是用于调用父类(超类)的一个方法。
关于super()函数解释不错
这里学到了两个很有意思的名词,鸭子类型和猴子补丁。但我觉得,不掌握这两个名字也没什么,就是给大家都知道的方法起了个新名字。
鸭子类型🦆(duck type)是对Python中数据类型本质上是由属性和行为来定义的一种解读。
猴子补丁🐒(monkey patching)是对Python中类和模块可以在外部被动态修改这种特性的一个比喻。
绑定类
类变量
class Animal:
name="动物"#类变量
def __init__(self,age):
self.age=age#实例变量
#使用
print(Animal.name)#类变量不需要实例化就可以使用
dog=Animal(18)
print(dog.age)
Animal.name="狗"
print(dog.name)#类变量可以在实例中被调用
静态方法与类方法
静态方法既不绑定类也不绑定实例,类方法绑定类
class Animal:
name="动物"#类变量
@staticmethod#装饰器语法
def play():
print('playing')#静态方法无参数,不能调用成员变量和方法
@classmethod
def play2(cls):#指向定义的类本身,可以读取和修改类变量
print(cls.name,'playing')
print(Animal.name)
Animal.play()
Animal.play2()
装饰器语法,在这里看起来就是一个标志,和之前的static int,const int很类似