标签:静态语言 鸭子类型 ubi 定义类 timer elf person 一些事 相同
类的定义形式多样
class Person:
#定义一个属性
name="小明"
#定义一个方法
def getName(self):
return self.name
class Person:
pass
p=Person()
构造函数:初始化方法,命名为__init__,在对象创建后自动调用
class Person:
name="小明"
def __init__(self):
print(self,self.name)
f=Person()
默认参数
class Person:
def __init__(self,n="小红"):
self.name=n
print(self,self.name)
>>>f=Person()
>>>p=Person("小明")
自定义参数
class Complex:
def __init__(self,realpart,imagpart):
self.real=realpart
self.imag=imagpart
class Person:
name="Max"# 类属性
age=12#类属性
def __init__(self,height):
self.height=height#实例属性
class Person:
name='Max'
age=10
#类型读取类属性
print(Person.name,Person.age)
#类名称改变类属性
Person.name="小明"
Person.age=22
print(Person.name,Person.age)
通过对象实例改变类属性
格式:对象实例.属性=…
class Person:
name='Max'
age=10
#读取类属性
print(Person.name,Person.age)
p=Person()
p.name='John'
print(p.name,p.age)
print(Person.name,Person.age)
# 'Max' 10
# 'John' 10
# 'Max' 10
相同名称的实例属性优先级高于类属性(覆盖)实例属性改变,不影响类属性
删除实例属性后,访问该名称对应的属性时,将访问类属性
class Person:
name='Max'
age=12
p=Person()
print(p.name)#Max
p.name='John'
print(p.name)#John
print(Person.name)#Max
del p.name
print(p.name)#Max
不同的实例对象,有不同的实例属性
class Person:
name='Max'
age=12
#用类名读取类属性
print(Person.name,Person.age)
# 用对象实例改变类属性
p=Person()
p.name='John'
print(p.name,p.age)
print(Person.name,Person.age)
q=Person()
q.age=21
print(q.name,q.age)
# Max 12
# 'John' 12
# Max 12
# Max 21
class Person:
name='Max'
age=22
#对象实例改变类属性
p=Person()
p.gender='male'
print(p.name,p.age,p.gender)
Python作为一种动态语言,除了可以在定义类时指定类属性外,还可以动态地为已经创建的对象绑定新的属性
class Person:
part_time=[]
def __init__(self,name):
self.name=name
def add_part(self,sh):
self.part_time.append(sh)
p=Person('Max')
q=Person('John')
q.add_part('read')
p.add_part('walk')
print(p.part_time)
print(q.part_time)
#['read','walk']
#['read','walk']
# part_time被共享了
使用实例属性替代类属性,以避免实例操作改变类属性变量的值
class Person:
def __init__(self,name):
self.name=name
self.part_time=[]
def add_part(self,sh):
self.part_time.append(sh)
p=Person('Max')
q=Person('John')
q.add_part('read')
p.add_part('walk')
print(p.part_time)
print(q.part_time)
#['walk']
#['read']
#各是各的
通过实例对象调用的方法一般以‘self’的变量作为第一个参数(其他名称也可以),self表示对象自身的含义,某个实例对象调用该方法时,将该对象作为第一个参数传递给self
class Person:
name='Max'
age=12
def getName(self):
return self.name
def getAge(self):
return self.age
p=Person()
print(p.getName(),p.getAge())
#Max 12
p.getName( )时,将p传递给self,执行return p.name得 到name,类似地,通过p.getAge( )得到age
class Person:
name='Max'
age=12
def getName(self):
return self.name
def getAge(self):
return self.age
p=Person()
print(p.getName(),p.getAge())
print(Person.getName(p),Person.getAge(p))
#Max 12
#Max 12
在类中可以定义类的方法
class Person:
name='Max'
age=12
@classmethod
def show(cls):
print(cls.name,cls.age)
一般通过类名称调用,调用时传递类参数,例如Person.show( ), 将Person 传递给cls,因此
print(cls.name,cls.age)等价于执行print(Person.name,Person.age)
class Person:
name='Max'
age=12
@classmethod
def show(cls):
print(cls.name,cls.age)
Person.show()
也可以通过实例对象调用,这时候对象p的类Person会传递给函数的参数cls
class Person:
name='Max'
age=12
@classmethod
def show(cls):
print(cls.name,cls.age)
p=Person()
p.show()
通过@staticmethod修饰,无参数传递
class Person:
name='Max'
age=12
@staticmethod
def display():
print(Person.name,Person.age)
通过类名称调用,不传递参数,与类方法调用不同(传递类参数)
通过类名称调用,不传递参数,与类方法调用不同(传递类参数)
class Person:
name='Max'
age=12
@classmethod
def show(cls):
print(cls.name,cls.age)
@staticmethod
def display():
print(Person.name,Person.age)
>>>Person.show()
>>>'Max' 12
>>>Person.display()
>>>'Max' 12
通过实例对象调用,不传递参数
class Person:
name='Max'
age=12
@staticmethod
def display():
print(Person.name,Person.age)
p=Person()
p.display()
#Max 12
Person类中的name 和age属性是公有的,可以直接在类外访问
class Person:
name='Max'
age=12
如果想定义为私有的,在属性前面加两个下划线‘__’
class Person:
__name='Max'
age=12
私有属性不能直接在类外访问
Person.name
#报错
私有属性,可以被类内定义的方法访问
class Person:
__name='Max'
age=12
def getName(self):
return self.__name
p=Person()
p.show()
可以在类内定义私有方法,在方法名称前加两个下划线‘__’
class Person:
__name='Max'
age=12
def __getName(self):
return self.__name
私有方法不能直接在类外调用
class Person:
__name='Max'
age=12
def __getName(self):
return self.__name
p=Person()
name=p.getName()
私有方法可被类内定义的其它方法调用
class Person:
__name='Max'
age=12
def __show(self):
print(self.name)
def display(self):
self.__show()
p=Person()
p.display()
继承的语法形式
class DerivedClassName(BaseClassName):
pass
子类通过继承可以获得父类的所有方法
class Person:
def __init__(self,name):
self.name=name
def getName(self):
return self.name
class Student(Person):
pass
p=Student('Max')
print(p.name)
print(p.getName())
对于父类的方法,子类实现重新定义
class Person:
def __init__(self,name):
self.name=name
def read(self):
print('The Person '+self.name+' is reading...')
class Student(Person):
def read(self):
print('The Student'+self.name+' is reading...')
p=Person('xiaoming')
p.read()
>>>The Person xiaoming is reading...
q=Student('xiaohong')
q.read()
>>>The Student xiaohong is reading...
若不想子类覆盖基类的方法,可将方法设为私有
class Person:
def __init__(self,name):
self.name=name
def __read(self):
print('The Person '+self.name+' is reading...')
def test(self):
self.__read()
class Student(Person):
def __read(self):
print('The Student'+self.name+' is reading...')
p=Person('xiaoming')
p.test()
>>>The Person xiaoming is reading...
q=Student('xiaohong')
q.test()
>>>The Peerson xiaohong is reading...
class Person:
def __init__(self,name):
self.name=name
def read(self):
print('The Person '+self.name+' is reading...')
class Student(Person):
def __init__(self,age):
self.age=age
>>>p=Student(12)
>>>p.age
>>>12
>>>p.name
>>>报错,没有name这个属性
class Person:
def __init__(self,name):
self.name=name
def read(self):
print('The Person '+self.name+' is reading...')
class Student(Person):
def __init__(self,name,age):
Person.__init__(name)
self.age=age
>>>p=Student('Hello',12)
>>>p.name
>>>'Hello'
>>>p.age
>>>12
class Person:
def __init__(self,name):
self.name=name
def read(self):
print('The Person '+self.name+' is reading...')
class Student(Person):
def __init__(self,name,age):
super().__init__(name)
self.age=age
>>>p=Student('Hello',12)
>>>p.name
>>>'Hello'
>>>p.age
>>>12
class Person:
def __init__(self,name):
self.name=name
def read(self):
print('The Person '+self.name+' is reading...')
class Student(Person):
def __init__(self,name,age):
super().__init__(name)
self.age=age
def getAge(self):
return self.age
>>>p=Student('xiaoming',12)
>>>print(p.getAge())
>>>'xiaoming'
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类
isinstance(p,Student)#True
isinstance(p,Person)#True
issubclass(Student,Person)#True
issubclass(Person,Student)#False
class DerivedClassName(Base1,Base2,Base2):
pass
继承也可一级级继承下来,而任何类,最终都可以回溯到根节点object,这些继承关系就像一颗倒挂的树。
子类把父类的所有功能都直接拿过来,这样就不必从零做起
多态:呈现多种形态
class Person:
def __init__(self,name):
self.name=name
def getName(self):
return self.name
def read(self):
print('The person is '+self.name+' is reading...')
class Student(Person):
def read(self):
print('The student is '+self.name+' is reading...')
class Teacher(Person):
def read(self):
print('The teacher is '+self.name+' is reading...')
def read_twice(person):
person.read()
person.read()
>>>read_twice(Person('xiaoming'))
>>>The person is xiaoming is reading...
>>>read_twice(Student('xiaoli'))
>>>The student is xiaoli is reading...
>>>read_twice(Teacher('xiaoliu'))
>>>The teacher is xiaoliu is reading...
新增Person的子类,不必对read_twice( ) 进行任何修改,就可以正常运行。
只管调用,不管细节
静态语言(例如Java),如果需要传入参数是
Person类型,则传入的对象必须是Person类型或者它的子类,否则,将无法调用read( )方法
class Timer:
def read(self):
print("Reading is good!")
read_twice(Timer())
>>>Reading is good!
>>>Reading is good!
动态语言的“鸭子类型”:并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来
像鸭子”,那它就可以被看做是鸭子。
将抽象得到的属性和功能相结合,形成一个有机整体,隐藏对象的属性和实现细节,仅对外提供
公共访问方式的接口
通过 类名. 或者 对象名. 形式访问封装内部的属性和方法
class Person:
add='Beijing'
def __init__(self,name):
self.name=name
def read(self):
print('The person '+self.name+'is reading')
>>>p=Person('Hello')
>>>p.add
>>>'Beijing'
>>>p.read()
>>>The person Helli is reading
好处:
模块:Python中,可理解为对应于一个.py文件,将属性变量和实现方法封装在这个文件中
包(package): 将多个模块分为一个包
包中包含多个模块
包中包含多个模块和子包
若main.py要引用package_b中的test_fact模块,导入包
可以使用:
通过模块名.函数名进行引用
from package_b import test_fact
print(test_fact.fact(3))
需要通过完整的名称进行引用
import package_b.test_fact
print(package_b.test_fact.fact(3))
若main.py要引用子包package_a_a中的hello模块,导
入包可以使用:
from package import item 方式导入包时,这个子项(item)既可以是子包也可以是其他命名,如函数、类、变量等
标签:静态语言 鸭子类型 ubi 定义类 timer elf person 一些事 相同
原文地址:https://www.cnblogs.com/mengxiaoleng/p/11566758.html