面向对象-02

'''
1.类的成员
class Foo:
# 构造方法
def __init__(self, name):
self.name = name #实例变量/字段
# 普通方法
def func(self):
pass

# obj是Foo类的对象,或称为Foo类的实例
obj = Foo('实参')

2.成员共分为三类:
变量:
-实例变量(字段)
-公有变量
-私有变量:用'__'把变量私有化
-类变量(静态字段)
-公有变量
-私有变量:用'__'把变量私有化,类外无法调用,只能在类里面被调用.且私有变量无法被子类继承,也即子类也无法调用,只能父类调用
class Foo:

#类变量/静态字段
country = '中国'

def __init__(self, name):
self.name = name #实例变量/字段
Foo.country = '中国' #类变量可直接通过 类名.类变量 的方法调用,当然用obj也可以调用

注意:方法中的私有变量只有该方法能够调用,类中的私有变量只有该类才能调用,就算是在该类中的方法也无法直接调用
class B:
__a = 13
def f1(self):
__b = 13
def f2(self):
b = B.__a + 2 #只有通过类名才可调用该类中的私有变量,该类中的方法也无法不通过类名直接调用
b = B.__b #__b属于f1的私有变量,除了f1外,其他方法和类都无法调用,因此这里会报错.
print(b)
obj = B()
obj.f2()

方法:
-实例方法
-静态方法
-类方法

何时写实例方法?
当方法需要使用对象中封装的值时,可以用实例方法.也即方法中有调用构造方法中的实例变量时.
class Foo(object):
def __init__(self, name):
self.name = name

def func(self):
print(self.name) #func中有调用__init__中封装的属性,因此可以说是实例方法,当未调用时,不能成为实例方法

obj = Foo('alex')
obj.func()

静态方法:
当方法中无需使用对象中封装的值时,可以选择静态方法.
class Foo(object):
def __init__(self, name):
self.name = name

@staticmethod
def display(): # 静态方法前需要加@staticmethod,且静态方法可以没有参数,当然加上参数也可以.
print('999') # 静态方法只能被对象调用,而实例方法对象和类都可以调用,这也是二者的区别.

类方法:
如果你需要在你的方法中用到你当前的这个类时,可以选择类方法.
class Foo(object):
def __init__(self, name):
self.name = name

@classmethod
def show(cls, x1, x2): #同实例方法中必有一个self参数一样,类方法中必有一个cls参数.
print(cls, x1, x2) #类方法在传参时不用传cls位置的参数,这个系统会自动把当前类传进去

Foo.show(1,8) #用 类名.方法() 的方式进行调用

静态方法/类方法 和实例方法的区别是什么?
1.定义时不同,实例方法前无@等属性
2.调用时不同,实例方法需要先实例化对象,在通过对象来调用,但静态方法和类方法可直接通过类名来调用.
3.使用环境不同,当你的方法中不需要用到对象封装的属性时,用静态方法,且当需要用到当前类时用类方法,否则用实例方法.

私有方法:
私有实例方法:
class Foo(object):
def __init__(self, name):
self.name = name

def __display(self, arg):
print('私有方法', arg)

obj = Foo()
obj.__display() #此句会出错,因为__display属于私有方法,无法在外部被访问

私有静态方法:
class Foo(object):
def __init__(self, name):
self.name = name

@staticmethod
def __display(arg):
print('私有静态方法', arg)

def func(self):
Foo.__display(123) #在类的内部可以调用私有方法

Foo.__display(123) #此句会报错,因为__display作为私有方法,无法在类外被访问
属性:
-公有属性
-私有属性
class Foo(object):
def __init__(self, name):
self.name = name

@property
def start(self): #属性不可以加参数的,只能有一个self,且前面需要有个@property
return 1

obj = Foo()
obj.start #属性方法在调用时是不需要加括号的,也即当你需要调用一个方法,不需要往里面传参且需要该方法给你一个返回值时,建议用属性方法.
'''
原文地址:https://www.cnblogs.com/gongteng/p/13543484.html