pythonClass类

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):

pythonClass类_第1张图片

__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):

效果
pythonClass类_第2张图片

你可能感兴趣的:(python,python)