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()
多态
子类方法覆盖父类方法
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/p/17059888.html