hasattr()
setattr()
getattr()
class Student(object):
pass
class Xiaoming(Student):
pass
为某个实例类动态的添加方法
(只会对操作过的对象产生影响,不会对整个类的分支产生影响)
__init__
__开头的属性是私有属性 private
__init__ 类的初始化程序
class Student(object):
count = 0
def __init__(self,name,age):
self.name = name
self.age = age
self.__age = '无法直接访问'
Student.count = Student.count + 1
# 函数每次实例执行的是__init__当函数调用循环之外的数值的时候就会形参闭包
# 这样写可以通过count 的大小来获取__init__
# python直接写道类中的变量 都可以视为static属性 自己的理解
def get_page(self):
return self.__age # 可以间接访问
# 既然直接写的属性是 static 属性 而且可以访问 那么
# 方法也我直接写的 可以访问么
# 当然可以 就是不能运行 因为self 还没有指向
不过我们可以通过比较风骚的方式调用
xiaoming = Student('小明',18)
print(Student.get_page(xiaoming)) # 无法直接访问
# self没有指向 我给他传一个不就好了
print(isinstance(s,Student)) # True
__solts__
__solts__
作用:用来现在当前这个类可以设置的一些属性做限制
下面就是 Student 这个类中只可以用 ‘name’,‘age’ 其他的 添加不上去
class Student(object):
__slots__ = ('name','age')
s = Student()
s.name = '小明'
s.age = 99
# s.sex = '男' # 加不上去,还会报错
print(s.name,s.age)
class Yxs(Student):
pass
yxs = Yxs()
yxs.sex = '男'
print(yxs.sex) # 男
可以看出继承这个类的类不会受到父类的限制
def set_age(self,age):
self.age = age
# self 使要指向当前调用这个方法的对象的
student.set_age = set_age
student.set_age(student,'18')
print(student.age) # 18
# 这样写很别扭 只是单纯的放到了 这个 student里 并没有改变指向
# python 提供了一个方法
# MethodType
from types import MethodType
student.set_age = MethodType(set_age,student)
# 这样在调用的时候就不用为self这个形参传参数了 (因为被默认为了当前对象)
student.set_age(99)
print(student.age) # 99
为整个类都添加某个方法
def set_age(self,age):
self.age = age
Student.set_age = set_age
xiaohong.set_age(2)
xiaohong.set_sex('男') # 会报错说找不到这个属性
def set_sex(self,sex):
self.sex = sex
print(xiaohong.age) # 2
通过上述我们可以知道如何为class添加属性 如何限制属性名
下面是对对象赋值时设置限制(有些值不能瞎赋值)
这里要用到修饰符 @
回忆
def log(func):
def warpper(*args,**kv):
return func(*args,**kv)
return warpper
@log
def ceshi():
pass
ceshi = log(ceshi)
@property 是官方给的一个@修饰方法 def property 这样
这个方法 会给我们暴露出一个 @属性名.setter
注意 使用这个的话 函数名也修改成属性名
属性名要和函数名字有些许区别
class Student
@proerty
def score(self):
return self._score
@score.setter
def score(self,value):
if not isinstance(value,int):
raise ValueError('请输入int类型的数据')
if value < 0 or value > 100:
raise ValueError('超出成绩的固定范围')
self._score = value
__str__
这个属性是在class实例化时自动执行的东东
一般class实例化时会返回
设置这个函数就会返回自己设置的内容
好分别
<__main__.Student object at 0x000002509F142400>
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name: %s)' % self.name
s = Student('Michael')
print(Student('Michael'))
# print(s)class Student(object):
__repr__
和__repr__
基本相同就像上图一样 s 是我实例化之后的对象 直接展示的话就是
谁实例化出来的对象和 和 在内存中的存储地址
一般__repr__
和__str__
要实现的功能都是相同的 可以这么写
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name: %s)' % self.name
__repr__ = __str__
s = Student('Michael')
s
# print(s)class Student(object):