python 类与对象

python 类与对象(未完待续)

定义

括号里的是继承类,如果没有类继承,就继承object类,它是所有类的基础类。

pass 是占位符,还可用在判断和循环中

class 类名(object):
    pass

# 栗子如下
class Person(object):
    pass
# 定义对象per1
per1 = Person()

属性

自定义属性和方法

python支持对象自定义属性和方法

from types import MethodType

class Person(object):
    pass
# 调用
def desc(self):
    print("%s"% self.name )
   
per = Person()
per.name = "jack" # 绑定自定义属性;Person类中没有定义name这一属性,per实体独有的name属性
per.desc = MethodType(desc, per) # 绑定自定义方法
per.desc() # 调用自定义的方法

限制实例的属性的绑定_ _slots_ _

# 限制person类仅能绑定name,age
class Person(object):
    __slots__ = ('name', 'age') 

per = Person()
per.age = 18 # 不报错
per.sex = 1 # 报错,sex并不在slots限制内

@property

对实例属性操作的时候,属性很可能不是直接暴露的,一般通过getter和setter方法来实现;或@property

class Person(object):
    __slots__ = ('name', 'age', '__score') # 用tuple定义允许绑定的属性名称

    @property
    def score(self):
        return self.__score

    @score.setter
    def score(self, val: float):
        if val > 0:
            self.__score = val

# 调用
per = Person()
per.score = 18

构造器 _ _init_ _

class Person(object):
    def __init__(self,name:str,age:int)

初始化类对象时会调用它。python的构造器不能重载,不能重载,不能重载

类中方法

  • 方法的第一个参数必须是 self,而调用时不需要传self
  • 自定义方法不能用_ _开头
class Student(object):
    def __init__(self,name:str,age:int,score:float) -> None:
        self.name = name
        self.age = age
        self.score = score
    def desc(self) -> None:
        print("%s %d %f"%(self.name,self.age,self.score))

访问限制

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样极不安全;要让内部属性不被外部访问,可以把属性的名称前加上两个下划线_ _,就变成了一个私有变量(private)使外部无法修改和访问

class Student(object):
    def __init__(self,name:str,age:int,score:float) -> None:
        self.__name = name
        self.__age = age
        self.__score = score
    def desc(self) -> None:
        print("%s %d %f"%(self.__name,self.__age,self.__score))

# 调用,虽然有修改语句,但是两次打印相同
stu = Student("jack",19,134.5)
stu.desc()
stu.__name = "tom"
stu.__age = 11
stu.desc()

get/set 支持外部对内部私有变量访问的通道

class Student(object):
    def __init__(self,name:str,age:int,score:float) -> None:
        # super(Student,self).__init__(name=name,age=age)
        self.__score = score
        self.__name = name
        self.__age = age
    # 获取name
    def get_name(self)->str:
        return self.__name
    
    # 设置name
    def set_name(self,name:str) ->None:
        print("设置名字")
        if len(name) > 0:
            self.__name = name
    # 介绍
    def desc(self) -> None:
        print("%s %d %f"%(self.__name,self.__age,self.__score))

继承

python支持多重继承,一个子类就可以同时获得多个父类的所有功能

class Animal(object):
    __slots__ = ('name')
    def desc(self):
        print(self.name)
        
class Runnable(object):
    def run(self):
        print('Running...')
# 继承了2个类
class Tigger(Animal,Runnable):
    pass
# 调用
tiger = Tigger()
tiger.name = 'wowo'
tiger.desc()
tiger.run()

多态

子类方法覆盖父类方法

posted @ 2023-01-18 15:14  勤匠  阅读(39)  评论(0编辑  收藏  举报