python学习笔记(十三) -- 多重继承和MixIn,以及@property的使用

多重继承

一个类继承好几个类

下面 类C 继承A又继承B 

>>> class A(object):
	name = 'zzh'
>>> class B():
	age = 22
	
>>> class C(A,B):
	pass
	
>>> C.age
22
>>> C.name
'zzh'	

但是写代码不仅仅是写代码,而是把现实的东西映射到代码上。

像这种多重继承会导致逻辑非常混乱,就比如说每个人都只有一个亲爹,你要非任个干爹,想从人那得到点好处,那关系再怎么好他也不是亲爹啊。

体现到代码上,上面的类A是类C的爹,这类C又看上类B拥有的age属性了,自己也想要,然后就任人当干爹,既然是干爹那你用继承就不合适,尤其是这种东西业务复杂以后会非常混乱,所以python中 出现了MaxIn。

MixIn   -- 类似于java中的Interface

当我们想给一个类附加一些别的类拥有的功能,且这两个类在现实逻辑中并没有包含关系,则我们往往在被继承的类的名字后面加上MixIn,用来标明继承该类可以获取一些功能,但这两个类又没有父子关系。

如下

张三是张四的爹,张三只会吃,所以他儿子张四也不咋地,就会吃

>>> class zhangsan(object):
	def eat(self):
		print('吃')

>>> 
		      
>>> class zhangsi(zhangsan):
		      pass

		      
>>> zhangsi = zhangsi()
		      

>>> zhangsi.eat()
		      
吃

后来这张四上学了,也意识到自己这样不行了,就开始努力学习了。所以它要掌握学习这项技能

>>> class BookMixIn(object):
	def learn(self):
		print('学习')
>>> class zhangsi(zhangsan,BookMixIn):
		      pass
>>> zhangsi = zhangsi()
		      
>>> zhangsi.eat()
		      
吃
>>> zhangsi.learn()
		      
学习

由于学习这是一项技能,张三和学习 并没有父子关系,所以显然说是继承不符合逻辑,于是我们在Book这个类名后面加上MixIn作为一个功能,且同时与继承的逻辑区分开来。

@property

回顾一下,通过一个set方法给属性设值相对于对象名.属性名给属性赋值的好处:

我们可以避免垃圾数据在产生,我们可以在set函数体内,通过if条件判断,输入的值是否符合我们的需求。

但是从另一方面来说,通过set函数赋值 以及 通过get方式取值显然没有直接通过对象名.属性名 方便。

好在python 提供了 @property 

@property的作用在于可以使类中获取和设置属性值的get、set方法,通过类名.属性名的形式去调用。

它实际上就是一个装饰器,如果在java中我们可以称其为 动态代理。spring中的 aop。

下面写个小案例体会一下:

>>> class Student(object):   
	def get_score(self):
		return self.score
	def set_score(self,value):
		if not isinstance(value,int):
			raise ValueError("请输入一个整数!")
		elif value < 0 or value > 100:
			raise ValueError("分数必须在1~100之间!")
		self.score = value

		
>>> s = Student()
>>> s.set_score(99)
>>> s.get_score()
99
>>> class Student(object):
	@property    #在原有的get方法上面加上 @property
	def score(self):
		return self._score  #注意由于方法名为score,所以属性名一定不要与方法名重名,否则会进入无限递归
	@score.setter  #在原有的set方法上面加上  方法名.setter ,注意原来的get和set方法现在名字一样都为score
	def score(self,value):  
		if not isinstance(value,int):
			raise ValueError("请输入一个整数!")
		elif value < 0 or value > 100:
			raise ValueError("分数必须在1~100之间!")
		self._score = value

		
>>> s = Student()
>>> s.score = 100  #通过 对象名 . 属性名 直接赋值
>>> s.score   #通过 对象名 . 属性名 获取属性值
100

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`postcss-px-to-viewport` 是一个 PostCSS 插件,用于在响应式设计中将像素单位(px)转换为视口相关的单位,如vw (viewport width) 或 vh (viewport height),以实现更灵活的布局和适应不同屏幕尺寸。当你在 Nuxt.js 项目中使用 SCSS,你可以利用 Nuxt 的官方支持或创建自定义的@mixin来整合这个功能。 首先,你需要安装 `postcss-px-to-viewport` 和可能需要的其他依赖,例如 `autoprefixer`: ```bash npm install postcss postcss-px-to-viewport autoprefixer --save-dev ``` 然后,在 Nuxt 的配置文件 `nuxt.config.js` 中启用 postcss 并添加 `postcss-px-to-viewport`: ```javascript export default { // ... build: { postcss: { plugins: { autoprefixer: {}, pxToViewport: { unitToConvert: 'px', // 要转换的单位,默认为 'px' viewportWidth: 1920, // 视口宽度,可根据实际需求设置 viewportHeight: null, // 视口高度,一般设为null自动计算 aspectRatio: 16 / 9, // 原生比例,可根据需要调整 fontFactor: 1, // 字体转换因子 unitPrecision: 5, // 小数位数 propList: [], // 需要转换的属性列表,如['*'] 或 ['all'] viewportUnit: 'vw', // 输出单位,默认为 'vw' selectorBlacklist: [], // 避免转换的类名或元素 minPixelValue: 1, // 最小转换值 mediaQuery: true, // 是否处理 media queries exclude: [], // 忽略某些选择器 }, }, }, }, // ... } ``` 接下来,在你的 SCSS 文件中,可以创建一个@mixin 来应用这个转换: ```scss // 在 Nuxt SCSS 模块中 @mixin px-to-viewport($width: 1920px) { @apply postcss-px-to-viewport(--viewport-width, $width); } // 使用 mixin .some-class { width: @include px-to-viewport(100px); height: 50px; padding: 10px; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值