1.多态
定义时的类型和运行时的类型不一样,即同一种行为对于不同的子类有不同 的行为表现。
前提:1.继承,多态必须发生在父类子类之间。2.重写,重写父类方法。
2.鸭子类型
在程序设计中鸭子类型是动态类型的一种风格。在这种类型中一个对象不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。在此类型中,关注的不是对象的类型本身,而是它如何使用。
3.python是一种弱类型语言
4.私有化属性
为了更好的保证属性安全,不能随意修改,将属性定义为私有属性。私有属性不能在类外部使用,以及继承的子类也无法使用。
语法:以两个下划线开头
class person(object):
def __init__(self,name,age):
self.name=name
self.__age=age
def __str__(self):
return f"{self.name}'s age is {self.__age}"
xm=person('xiaoming',20)
print(xm)#内部的str方法访问name和__age
print(xm.name)
print(xm.__age)
对私有化属性的访问和修改。
class person(object):
def __init__(self,name,age):
self.name=name
self.__age=age
def __str__(self):
return f"{self.name}'s age is {self.__age}"
def get_age(self):
return self.__age
def set_age(self,age):
self.__age=age
xm=person('xiaoming',20)
print(xm)
print(xm.get_age())
xm.set_age(23)
print(xm)
print(xm.get_age())
输出:
xiaoming's age is 20
20
xiaoming's age is 23
23
5.私有化方法
私有化方法的概念与私有化属性相同,有些方法不允许外部调用,或防止子类重写,将方法设置为私有化方法。
class A(object):
def __fun1(self):
print("private")
def fun1(self):
print('public')
a=A()
a.fun1()
a.__fun1()#此语句会出错
6.其它知识点
def fun1(musen: Animal):
musen.fun()
这里的musen: Animal是函数的类型注解。它告诉读者,这个函数期望musen参数是一个Animal类型(或者Animal类型的子类)的实例。
但是也可以接收不是Animal类型的实例,Python解释器不会报错,但可能会在运行时抛出AttributeError,如果那个实例没有fun方法的话。
如果你希望确保fun1函数只接收Animal类型或其子类的实例,你可以使用运行时类型检查,但这通常不是Python的推荐做法,因为它违背了Python的动态类型特性。然而,在某些情况下,为了代码的健壮性,你可能会选择这样做:
def fun1(musen):
if not isinstance(musen, Animal):
raise TypeError("Expected an instance of Animal or its subclass")
musen.fun()
isinstance() 是 Python 中的一个内置函数,用于判断一个对象是否是一个已知的类型。这个函数会考虑子类的情况,即如果一个对象是某个类的子类的一个实例,那么 isinstance() 也会返回 True。
isinstance() 的基本语法是:
isinstance(object, classinfo)
其中:
object 是要检查的对象。
classinfo 可以是直接或间接类名、基本类型或者由它们组成的元组。
如果 object 是 classinfo 的实例,或者 object 是 classinfo 的子类的一个实例,那么 isinstance() 返回 True,否则返回 False。
7.单下划线,双下划线和头尾双下划线的说明
_xxx:表示的是protected类型的变量,保护类型,只允许其本身和子类进行访问,不能使用from xxx import * 的方式导入。
__xxx__:魔法方法,开发者不允许创建此类型方法。
xxx_:避免属性名与python关键字冲突。
__xxx:私有化
8.属性函数
property,访问私有化属性和方法。
class test(object):
def __init__(self,num):
self.__num=num
def get_num(self):
return self.__num
def set_num(self,num):
self.__num=num
pro=property(get_num,set_num)
xm=test(1)
print(xm.pro)
xm.pro=2
print(xm.pro)
在Python中,property() 是一个内置函数,用于在新式类(即继承自 object 的类)中返回属性值。它通常用于实现所谓的“托管属性”(managed attributes),即这些属性的访问和修改不是直接进行的,而是通过一些方法(如 getter、setter 和 deleter)来控制的。
property() 函数可以接受一到四个参数:
fget:一个用于获取属性值的方法(getter)。
fset:一个用于设置属性值的方法(setter)。
fdel:一个用于删除属性的方法(deleter)。
doc:属性的文档字符串(可选)。
class test(object):
def __init__(self,num):
self.__num=num
@property
def num(self):
return self.__num
@num.setter
def num(self,num):
self.__num=num
xm=test(2)
print(xm.num)
xm.num=9
print(xm.num)
在Python中,@property是一个内置的装饰器,
用于将方法转化为属性的getter方法。这意味着
你可以像访问数据属性一样访问方法,而无需在调用时使用括号。
此外,你还可以使用@<name>.setter
和@<name>.deleter装饰器
来定义属性的setter和deleter方法。
9.单例模式
单例模式 是一种常用的软件设计模式,主要目的是确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。在很多情况下,一个系统中只需要一个唯一的对象来协调系统的整体行为,例如系统日志对象、配置文件读取对象、线程池对象等。这些对象如果使用单例模式来创建,就能避免重复创建对象造成的资源浪费,并可以更方便地访问和管理这些对象。
单例模式的实现通常包含以下几个步骤:
- 私有化构造函数:通过将类的构造函数设为私有,可以防止外部代码通过
new
关键字来创建类的实例。 - 提供静态的公有方法来获取实例:这个方法通常会被命名为
getInstance()
或类似的名称。在这个方法中,会先判断是否已经创建了类的实例。如果已经创建,则直接返回该实例;否则,先创建实例,并保存下来,然后再返回。 - 确保线程安全:在多线程环境下,需要确保
getInstance()
方法的线程安全,以避免多个线程同时创建实例导致的问题。这可以通过同步代码块、双重检查锁定等方式来实现。
class test(object):
_instance=None
def __new__(cls):
if cls._instance is None:
cls._instance=super().__new__(cls)
return cls._instance
a=test()
b=test()
print(id(a))
print(id(b))
10.运算符
算术运算符:
+:加法
-:减法
*:乘法
/:除法(返回浮点数结果)
//:整数除法(返回商的整数部分)
%:取模(返回除法的余数)
**:乘方(如a ** b表示a的b次方)
比较运算符(也称为关系运算符):
==:等于
!=:不等于
>:大于
<:小于
>=:大于等于
<=:小于等于
赋值运算符:
=:简单的赋值运算符
+=:加法赋值运算符(如a += b相当于a = a + b)
-=:减法赋值运算符
*=:乘法赋值运算符
/=:除法赋值运算符
//=:整数除法赋值运算符
%=:取模赋值运算符
**=:乘方赋值运算符
位运算符:
&:按位与
|:按位或
^:按位异或
~:按位取反
<<:左移
>>:右移
逻辑运算符:
and:逻辑与
or:逻辑或
not:逻辑非
成员运算符:
in:检查一个值是否存在于一个序列中(如列表、元组或字符串)
not in:检查一个值是否不存在于一个序列中
身份运算符:
is:检查两个对象是否是同一个对象(即它们的内存地址是否相同)
is not:检查两个对象是否不是同一个对象
运算符优先级:
Python运算符具有不同的优先级,例如乘法和除法的优先级高于加法和减法。你可以使用括号来改变运算的优先级。
三元运算符(条件表达式):
a if condition else b:如果condition为真,则返回a,否则返回b。
11.__new__()
__new__方法的作用是,创建并返回一个实例对象,调用一次返回一个对象。 继承自object的类才有此魔法方法。 注意: __new__是在对象实例化时调用的第一个方法 __new__至少有一个参数cls,代表要实例化的类,此参数由解释器自动提供,其它参数直接传给__init__方法 __new__没有返回实例对象,__init__方法就不会调用 在__new__方法中,不能调用自己的__new__方法,即return cls.__new__(cls),否则会出错